4

これらの 2 つのコードは、2 つの異なる出力を提供します。

class Test:
    def __get__(self, instance, owner):
        return 42
    def __set__(self, instance, value):
        pass

class A:
    a = Test()

a = A()
print(a.a) // print 42
a.a = 0
print(a.a) // print 42

class Test:
    def __get__(self, instance, owner):
        return 42
    def __set__(self, instance, value):
        pass

class A:
    pass

a = A()
a.a = Test()
print(a.a) // print <__main__.Test object at 0xb700d6cc>
a.a = 0
print(a.a) // print 0

属性は Python エンジンにどのように保存されますか?

4

2 に答える 2

2

Testクラスは「属性」とは呼ばれず、記述です。記述子は、定義上、(貧弱な Python 2 ユーザー向けの新しいスタイルの) クラスに格納されている場合にのみ機能します。非クラス オブジェクトの記述子オブジェクトには特別な意味はなく、他のオブジェクトと同様に扱われます。これらの__get__メソッドは取得時に__set__無視され、置換時に無視されます。

于 2012-10-13T19:03:27.263 に答える
0

最初のケースでは、クラスTestはクラスAの記述子として機能し、メソッドを定義__get____set__ます。

クラスの属性として、メソッドany classを使用する場合、それはクラスのとしてではなく、クラスのとして機能します。 したがって、その変数に何かを割り当てると、メソッドが呼び出され、それにアクセスしようとすると、メソッドが呼び出されます。記述子は、およびを介してクラスの属性へのアクセスを提供するだけです。__get____set__descriptorattribute
descriptor's __set__descriptor's __get__getterssetters

したがって、a = Test()クラスAで実行すると、descriptors__get__メソッドが呼び出され、値42が返され、それに割り当てられます。

一方、2番目のケースでは、class Test他のすべてのクラスと同じようにインスタンス化しています。したがって、a.aクラスのインスタンスへの参照を表しますTest

于 2012-10-13T19:04:55.940 に答える