为什么在进行赋值时 属性 属性没有被右侧替换?
Why isn't the property attribute being replaced by the right hand side when making assignments?
给出以下 class(来自 https://www.programiz.com/python-programming/property):
# using property class
class Celsius:
def __init__(self, temperature=0):
self.temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
# getter
def get_temperature(self):
print("Getting value...")
return self._temperature
# setter
def set_temperature(self, value):
print("Setting value...")
if value < -273.15:
raise ValueError("Temperature below -273.15 is not possible")
self._temperature = value
# creating a property object
temperature = property(get_temperature, set_temperature)
当我们赋值c.temperature = 100
时(c
是Celsius
的一个实例),有谁知道为什么它调用setter函数,而不是替换property
对象(这是原始的 c.temperature
),编号为 100
?
这就是描述符协议的工作原理。 c.temperature = 100
的意义取决于Celsius.temperature
是否存在。如果是,并且定义了 Celsius.temperature.__set__
,则使用 Celsius.temperature.__set__(c, 100)
而不是直接将值分配给实例属性(例如,c.__dict__['temperature'] = 100
)。
property
是实现描述符协议的类型。它的 __set__
方法调用 setter(在您的示例中为 set_temperature
)。
给出以下 class(来自 https://www.programiz.com/python-programming/property):
# using property class
class Celsius:
def __init__(self, temperature=0):
self.temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
# getter
def get_temperature(self):
print("Getting value...")
return self._temperature
# setter
def set_temperature(self, value):
print("Setting value...")
if value < -273.15:
raise ValueError("Temperature below -273.15 is not possible")
self._temperature = value
# creating a property object
temperature = property(get_temperature, set_temperature)
当我们赋值c.temperature = 100
时(c
是Celsius
的一个实例),有谁知道为什么它调用setter函数,而不是替换property
对象(这是原始的 c.temperature
),编号为 100
?
这就是描述符协议的工作原理。 c.temperature = 100
的意义取决于Celsius.temperature
是否存在。如果是,并且定义了 Celsius.temperature.__set__
,则使用 Celsius.temperature.__set__(c, 100)
而不是直接将值分配给实例属性(例如,c.__dict__['temperature'] = 100
)。
property
是实现描述符协议的类型。它的 __set__
方法调用 setter(在您的示例中为 set_temperature
)。