这两个代码会给出两个不同的输出,为什么?
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引擎中存储属性?
答案 0 :(得分:2)
您的Test
课程未被称为“属性”,它是descriptor。根据定义,描述符仅在存储在(新样式,对于可怜的Python 2用户)类时才起作用。非类对象上的描述符对象没有特殊含义,它们被视为任何其他对象。检索它们时会忽略它们的__get__
方法,并且在替换它们时忽略它们的__set__
。
答案 1 :(得分:0)
在第一种情况下,课程Test
会为您的A类设置描述符,因为它定义了__get__
和__set__
方法。
如果您使用any class
__get__
,__set__
种方法作为班级中的属性,则会为您的班级充当descriptor
,而不是{ {1}}。
因此,当您为该变量分配内容时,会调用attribute
descriptor's
方法,当您尝试访问该方法时,会调用__set__
descriptor's
方法。描述符只是通过__get__
和getters
因此,当您在A类中执行setters
时,将调用描述符a = Test()
方法并返回值__get__
并将其分配给它。
而在第二种情况下,您就像其他所有类一样实例化42
。
因此,class Test
表示对类a.a
的实例的引用。