3

メソッドが最初に属性が存在することを確認し、それ以外の場合は関数を呼び出してそれを計算する必要があるクラスがあります。次に、属性が ではないことを確認してNone、それを使用していくつかの操作を実行します。わずかに異なる 2 つのデザインの選択肢があります。

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 番目の選択肢は、より広く使用されているようです。ただし、私の目的 (情報理論に関連する科学計算) ではtry except、このクラスが実際には他のクラスと対話せず、データを取得してさまざまなことを計算するだけであるため、どこでもブロックを使用するのは少しやり過ぎになる可能性があります。

4

2 に答える 2

0

まず、hasattrオブジェクトに属性があるかどうかを確認するために使用できTrueます。属性が存在する場合は返されます。

hasattr(object, attribute) # will return True if the object has the attribute

次に、Python で属性アクセスをカスタマイズできます。詳細については、https ://docs.python.org/2/reference/datamodel.html#customizing-attribute-access を参照してください。

基本的に、これを達成するためにメソッドをオーバーライドする__getattr__ので、次のようになります。

class myclass2(): def init (self): パス

def compute_attr(self):
    self.attr = 1
    return self.attr

def print_attribute(self):
    print self.attr

def __getattr__(self, name):
    if hasattr(self, name) and getattr(self, name)!=None:
        return getattr(self, name):
    else:
        compute_method="compute_"+name; 
        if hasattr(self, compute_method):
            return getattr(self, compute_method)()

getattr内部の属性にアクセスするためだけに使用することを確認してください。そうしない__getattr__と、無限再帰が 発生します。

于 2017-01-07T14:16:22.377 に答える