首页 > 解决方案 > 为什么在进行分配时属性属性没有被右侧替换?

问题描述

给定以下课程(来自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 = 100c是 的一个实例Celsius)时,有谁知道它为什么调用 setter 函数,而不是用数字替换property对象(这是原始的c.temperature100

标签: pythonpython-decorators

解决方案


这就是描述符协议的工作方式。的含义c.temperature = 100取决于是否Celsius.temperature存在。如果是,并且Celsius.temperature.__set__已定义,则Celsius.temperature.__set__(c, 100)使用 then 而不是直接将值分配给实例属性(例如,c.__dict__['temperature'] = 100)。

property是一种实现描述符协议的类型。它的__set__方法调用设置器(set_temperature在您的示例中为 )。


推荐阅读