This question already has an answer here:
Why is the Descriptor not getting called when defined as instance attribute?
(1个答案)
3年前关闭。
请参见下面的简单示例:
我想知道为什么它们有不同的输出。
我知道
(1个答案)
3年前关闭。
请参见下面的简单示例:
class Celsius(object):
def __init__(self, value=0.0):
self.value = float(value)
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
self.value = float(value)
def __call__(self):
print('__call__ called')
class Temperature(object):
celsius = Celsius()
def __init__(self):
self.celsius1 = Celsius()
T = Temperature()
print('T.celsius:', T.celsius)
print('T.celsius1:', T.celsius1)
output
T.celsius: 0.0
T.celsius1: <__main__.Celsius object at 0x023544F0>
我想知道为什么它们有不同的输出。
我知道
T.celsius
会称为__get__
,而T.celsius1
会称为__call__
。 最佳答案
区别在于,第一个属性是类属性,而第二个属性是实例属性。
按照the documentation的规定,如果至少实现第一个Descriptor
方法(__get__
,__set__
和__delete__
)的对象保存在class属性中,则在访问时将调用其__get__
方法。实例属性不是这种情况。您可以了解更多from the howto。
仅当像函数一样调用对象时,该对象的__call__
方法才起作用:
>>> class Foo:
... def __call__(self):
... return "Hello there!"
...
>>> f = Foo()
>>> f()
'Hello There!'
关于python - 关于python中的__get__和__call__的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9905720/
10-12 18:53