我使用python描述符模拟一些数据.
class Number:
def __init__(self):
self.num = 0
def __get__(self, instance, obj):
print("is getting number")
return self.number
def __set__(self, instance, value):
print("is setting number")
self.number = value
def __str__(self):
return str(self.number)
num = Number()
num = 2
print(num + 7)
Run Code Online (Sandbox Code Playgroud)
输出:
9
Run Code Online (Sandbox Code Playgroud)
它似乎成功地调用方法__get__和__set__,但我不知道为什么没有输出消息is getting number或is setting number.
我不确定python是否调用了描述符方法.
我的问题是什么时候会调用描述符方法?
我总结了我的起源猜测:
得到
obj.prop获取属性时,prop是另一个设置描述符的对象a + 5.如果a有描述符并将调用__get____get__get函数体,然后调用__call__运行该函数.组
obj = 5但我一定是错的,我需要有人告诉我正确的概念.
您的描述符未被调用,并且无法编写描述符或其他任何内容来执行您似乎想要的操作.
当你这样做时num = 2,你抛弃了你的Number对象并将变量num设置为普通数字2.当你向它添加7时,它等于9,因为它只是一个常规数字.你的Number班级没有任何参与.
描述符允许您勾选当您执行obj.foo或执行操作时发生的事情obj.foo = blah.在这些情况下,它是foo描述符,而不是obj,并且描述符仅在它是属性时才起作用.没有办法改变你做的事情obj = blah,obj一个裸名称(即没有点或[]).关于你的猜测:
得到
obj.prop并且prop是一个描述符时,它__get__就会被调用.请注意,这prop是描述符,而不是obj.a + 5.如果a有描述符并将调用__get__
__add__魔术方法或其他运算符的类似方法覆盖此类行为__get__get函数体,然后调用__call__运行该函数.
__call__,则obj()调用它__call__而不涉及任何描述符.组
obj = 5
obj.prop = 5,prop是描述符.底线是描述符仅在它们是类的属性时才起作用.只是在你尝试做的时候创建一个"裸"的描述符(即,做obj = SomeDescriptorClass())将不会做任何事情.
另外,作为旁注,描述符仅在新样式类上设置时才起作用.如果您使用的是Python 2,这意味着持有描述符的类必须继承object.