【问题标题】:Python property does not behave as expectedPython 属性的行为不符合预期
【发布时间】:2014-09-01 06:43:41
【问题描述】:

我正在阅读以下网站上的解释和示例:

http://www.programiz.com/python-programming/property

当我尝试它时,代码似乎没有按预期运行。所以我尝试做的是执行以下操作:

class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32

    def get_temperature(self):
        print("Getting value")
        return self._temperature

    def set_temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        print("Setting value")
        self._temperature = value

    temperature = property(get_temperature,set_temperature)

c = Celsius()

我希望输出如上述网站所述:

Setting value #That means that "set_temperature" was called by the constructor when the object is being created

但是我根本没有得到任何输出。程序运行没有错误,但屏幕仍然是空的。 是不是我做错了什么?

【问题讨论】:

    标签: python python-2.7 properties


    【解决方案1】:

    属性仅适用于新式类。您的Celsius 类需要继承自object

    还请注意,如今将属性编写为装饰器更为惯用:

    class Celsius(object):
        def __init__(self, temperature = 0):
            self.temperature = temperature
    
        def to_fahrenheit(self):
            return (self.temperature * 1.8) + 32
    
        @property
        def temperature(self):
            print("Getting value")
            return self._temperature
    
        @temperature.setter
        def set_temperature(self, value):
            if value < -273:
                raise ValueError("Temperature below -273 is not possible")
            print("Setting value")
            self._temperature = value
    

    【讨论】:

    • 感谢您的回答和您的 cmets。
    【解决方案2】:

    默认情况下,Python 2.7 仍然使用“旧式类”。如果您使用以下方式创建新样式类,则该示例有效:

    class Celsius(object):
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多