私は、メソッドが最初に属性が存在するかどうかを検証し、そうでなければそれを計算する関数を呼び出す必要があるクラスを持っています。次に、属性がNone
でないことを確認して、その属性でいくつかの操作を実行します。私はわずかに異なる2つの設計の選択を見ることができます:Pythonデザイン - クラス属性の初期化、設定、取得
class myclass():
def __init__(self):
self.attr = None
def compute_attribute(self):
self.attr = 1
def print_attribute(self):
if self.attr is None:
self.compute_attribute()
print self.attr
そして
class myclass2():
def __init__(self):
pass
def compute_attribute(self):
self.attr = 1
return self.attr
def print_attribute(self):
try:
attr = self.attr
except AttributeError:
attr = self.compute_attribute()
if attr is not None:
print attr
、私が冗長になることができ、すべてのクラス属性を事前にNone
に設定されていることを確認する必要がありますオブジェクトの構造を明確にする。
2番目の選択肢は、より広く使用されているようです。しかし、私の目的(情報理論に関連する科学的コンピューティング)は、このクラスが実際に他のクラスとやりとりするわけではないので、少しでも過剰なものになることがあります。データを取り、多くのものを計算します。
は、あなたがこのような何かをしたい、あなただけ
__getattr__
内の属性にアクセスするためにgetattr
を使用していることを確認したり、無限再帰になってしまいます。http://stackoverflow.com/questions/3012421/python-memoising- deferred-lookup-property-decoratorです。クラス自体を印刷することは非常に非平凡ではありません。代わりに '__repr__'や' __str__'を実装してください。 – jonrsharpe各クラスオブジェクトは確かに属性 'attr'を持つべきであるので、ファーストクラスのデザインを使う方が良いです。これは、このクラスの属性は何かを明確にしています。 attrをクラス属性として設定することもできます。self.attrでアクセスするときは、attrのコピーを呑み込んでしまいます。perticularオブジェクトだけを設定/取得することもできます。 – Roshan