2012-07-26 9 views
5

私はPythonに関してこの質問をしていますが、おそらくほとんどのOOP言語に当てはまります。「ただ一つのインスタンス」のPythonクラスを作成していますか?

データモデルをどのプログラムでも一度しか使用しない場合、クラス/静的メソッドと属性を持つクラスを作成するか、通常のクラスを作成して一度インスタンス化してそのコピーを使用することができます。この場合、どちらの方法が優れているのですか?

Pythonでは、モジュールを作成して、クラスと同じように使用できます。この場合、どちらの方が優れているのですか?

例:データにアクセスしてファイルに保存するための中央データ構造が必要です。

モジュールの方法:

data.py

attributes = something 
... 
def save(): 
... 

main.py

import data 
data.x = something 
... 
data.save() 

クラスの道:

class Data: 
    attributes = something 
    @classmethod 
    def save(cls): 

Data.x = something 
Data.save() 

インスタンス道

class Data: 
    def save(self): 

data = Data() 
data.x = something 
data.save() 
+4

なぜdownvoteですか?これは正当なプログラミング問題です。 – darkfeline

+1

'singleton python'のためのstackoverflowの検索 – warvariuc

+2

改訂された質問ははるかに優れています。私はクローズ(重複を除く)が現在保証されているとは思わない。 –

答えて

5

モジュールは、共通構造を「名前空間」に囲むことを意味します。しかし、実際にはPythonではモジュールは単なるファイルなので、あなたはそれらを整理することができます。一部の人は、1つのモジュールに多くの機能を搭載しています。パッケージやサブパッケージの上にそれらを広げる人もいます。あなたが望む再利用性に依存します。モジュールにたくさんの依存関係があり、少量だけ再利用したい場合は、それらを分割することが理にかなっています。

クラスを使用すると、サブタイプとして継承できるタイプを定義できます。また、そのクラスの各インスタンスで状態を定義することもできます。

あなたのクラスに状態がなく、静的メソッド/クラスメソッドのみがある場合は、クラスは必要ありません。あなたは機能が必要です。

また、モジュールを作成してクラスのように使用することもできません。モジュールはサブクラスを持つことができません。ロード時に一度だけ基本モジュールinitがあり、次にオブジェクトのスコープがあります。

あなたがしているものが定数である場合、それらはアプリケーションの生活のために一度定義されていることを意味し、文字列、辞書、リストのようなプリミティブ型の束を持つconstants.pyモジュールを作成するだけです。

+1

モジュールはクラスと似ています(私の例を見てください)。私は状態とメソッドで何かを探していますが、私は1つのインスタンスしか必要としないので、クラスやインスタンスを使用しますか? – darkfeline

+0

モジュールはそのスコープ用にのみ使用しています。モジュールオブジェクトではなく、クラスのようなものではありません。どのオブジェクトも属性を持つことができます。 – jdi

+0

状態とメソッドは、シングルトンパターンを示唆することがあります。いくつかは悪いスタイルであるとしてそれらに眉をひそめますが。状態と設定があり、特定の機能が必要な場合は、通常のクラスにすることができます。しかし、グローバルを積極的に変更する構造は避けるべきです。定数は通常読み取り専用です – jdi

2

標準ランダムモジュールの実装では、モジュールレベルのインスタンス作成と使用の両方を示すデザインが優れています。

たとえば、私がrandom.random()を呼び出すと、インポート時に初期化されたRandomクラスの隠しインスタンスが使用されます。私は、デフォルトで満足していない場合、私は

​​

、その後隠しのインスタンスと状態を共有しない発電機を持つことができます。このアプローチに興味がある場合は、random.pyをよく読んでください。それほど複雑ではないコードの関連する行はほんのわずかです。

このアプローチでは、シングルトンに対して興味深いPythonicのひねりを与えます。インポート時に自動的にビルドしますが、必要に応じてさらにインスタンス化することを妨げません。

関連する問題