python - 为什么在进行分配时属性属性没有被右侧替换?
问题描述
给定以下课程(来自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)
使用 then 而不是直接将值分配给实例属性(例如,c.__dict__['temperature'] = 100
)。
property
是一种实现描述符协议的类型。它的__set__
方法调用设置器(set_temperature
在您的示例中为 )。
推荐阅读
- xamarin - Objective-sharpie ApiDefinition 包含重载方法?
- html - 我没有创建的网页出现在我的谷歌分析中
- c# - 如何卸载 EF Core 表?或者如何删除所有迁移?或者如何从用户代码中调用 `dotnet ef database update 0`?
- javascript - ReactJS - 使用重定向组件传递道具
- javascript - 如何确定 JavaScript 对象是键控集合、索引集合还是根本不是集合?
- android - Android - 系统取消我的闹钟,未经我的许可
- r - 在 dplyr 中使用 group_by() 与 filter() 类似吗?
- javascript - 通过电子邮件发送动态创建的 JS 表单数据
- javascript - 如何设置验证器模式不接受 angularjs 中的零和空白空间
- list - 使用枚举迭代 elixir 中的元组列表