1

を使用してクラスの属性にアクセスしているときに何かを印刷しようとしています__getattribute__ 。ここでの大きな問題は再帰であり、getattribute メソッドをオーバーライドしているという事実です。

この問題を解決するには、メタクラスを使用する必要があると思います。とにかく、この問題の答えがあれば。

4

1 に答える 1

2

__getattribute__インスタンスのすべての属性アクセスに使用されます。それはself.recursionその方法に含まれます。

を使用する必要はほとんどありません__getattribute__。実際に適切なユースケースがある場合は、属性アクセスを避けるか、super(A, self).__getattribute__()無限再帰の問題を避けるために使用してください。

ユースケース (属性がアクセスされるたびに何かを出力する) では、super()still を使用して元の属性を返します。

class A(object):
    def meth(self):
        return "met"

    def __getattribute__(self, name):
        print "IN CLASS A"
        return super(A, self).__getattribute__(name)

super()を機能させるには、 から継承した新しいスタイルのクラスを使用する必要があることに注意してくださいobject。他の何かから継承していて、他の何かに__getattribute__メソッドがある場合、それはすでに新しいスタイルのクラスです。

于 2014-06-04T13:42:30.340 に答える