Python在创建属性和在类中声明属性之间有什么区别?

时间:2012-10-13 19:01:03

标签: python descriptor

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

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引擎中存储属性?

2 个答案:

答案 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的实例的引用。