2016-09-18 2 views
2
class CIFAR10Record(object): 
    pass 

result = CIFAR10Record() 
result.height = 32 
result.width = 32 
result.depth = 3 

このコードスニペットは、クラスとそのインスタンスを作成します。Pythonでこのようにクラスとインスタンスを作成するメリットとデメリットは何ですか?

このパターンのメリットとデメリットは何ですか?

+0

「この方法」とは、外部からインスタンスの変数に割り当てることです。それらのメンバ変数が '__init__'で何かに初期化されている限り、それは問題ありません。そうでなければ、どのメンバ変数が存在するのかを理解することが難しいからです。私はそれには「利点」があるとは言いません。ところで、あなたのインデントは間違っています。 – zvone

答えて

4

このコードでは、関連するフィールドの数を「まとめて」まとめるためにクラスを使用しています。

非常に柔軟性があります。クラスはメンバーなしで定義されます。どの機能でどのフィールドを追加するかを決めることができます。異なる呼び出しは、このクラスのオブジェクトを作成し、異なる方法でそれらを生成することができます(同じように、同じクラスのオブジェクトを異なるメンバで持つこともできます)。

この柔軟性も欠点です。これは構造が欠けています。コードを見てクラスがどのメンバーを持つかを決めるのは難しいです。また、このようなオブジェクトを取得してメンバーを繰り返し処理するのは簡単ではありません。最後に、クラスはencapsulationの極端なケースです。全体で


、私はより良い選択肢があると思う:この柔軟性は本当に(それ自体が問題である)必要とされている場合は

は、あなたの代わりにdictを使用して検討する必要があります。

result = {} 
result['height'] = 32 
result['width'] = 32 
result['depth'] = 3 

これは、その結果がちょうどフィールドのグループです(私見)ここではより明確だし、dict's methodsを使用してフィールドを反復処理する方が簡単です。

このような柔軟性が不要な場合は、コード量を最小限に抑えるための方法ですので、collections.namedtupleの使用を検討する必要があります。

import collections 

CIFAR10Record = collections.namedtuple('CIFAR10Record', ['height', 'width', 'depth']) 
+0

私の質問にお答えいただきありがとうございます! – jiuses

+0

@jiusesようこそ。がんばろう。 –

関連する問題