4

这两个代码将给出两个不同的输出,为什么?

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__方法作为一个属性,它作为descriptor你的类的一个,而不是一个attribute.
因此,当您为该变量赋值时,该descriptor's __set__方法被调用,当您尝试访问它时,该descriptor's __get__方法被调用。getters描述符只是通过和提供对类属性的访问setters

因此,当您a = Test()在类 A 中执行此操作时,将__get__调用描述符方法并42返回值并将其分配给它。

class Test而在第二种情况下,您就像其他所有类一样实例化。因此,a.a表示对 class 实例的引用Test

于 2012-10-13T19:04:55.940 回答