5

Python に関してこの質問をしていますが、おそらくほとんどの OOP 言語に適用できます。

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

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

2 に答える 2

5

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

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

クラスに状態がなく、staticmethods/classmethods のみの場合、クラスは必要ない可能性があります。関数が必要なだけです。

また、モジュールを作成してクラスのように使用することはできません。モジュールにサブクラスを含めることはできません。それらは、ロード時に一度基本的なモジュールを初期化してから、オブジェクトのスコープを持っているだけです。

あなたが求めているのが定数である場合、つまりアプリの存続期間中に一度だけ定義される場合は、文字列、辞書、リストなどの一連のプリミティブ型を含む constants.py モジュールを作成するだけです。

于 2012-07-26T05:50:17.260 に答える
3

標準のランダム モジュールの実装には、ユーザーにシングルトンを強制することなく、モジュール レベルのインスタンスの作成と使用の両方を示す優れた設計があります。

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

my_random = random.Random()
my_random.seed('not needed but illustrative seed call')
coin_toss = my_random.random()

次に、非表示のインスタンスと状態を共有しないジェネレーターを用意します。このアプローチに興味がある場合は、random.py非常によく文書化されているを読んでください。関連するコードは数行しかなく、それほどトリッキーではありません。

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

于 2012-07-26T10:50:37.680 に答える