Python忽略二传手

时间:2018-06-19 18:48:41

标签: python object attributes python-2.x python-2.6

我是python的新手,我尝试创建一个以get / set为属性的类。我已经从互联网上复制了一个简单的示例,似乎Python忽略了我的二传手。我是否在做一些非常愚蠢的事情,因为我不明白为什么它不起作用。

我正在Linux上运行python 2.6.6。

谢谢

#!/usr/bin/python

class Celsius:
    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 temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        print("Setting value")
        self._temperature = value

c = Celsius()

c.temperature = -5555

print c.temperature

我在命令行中唯一拥有的是它显示-555。它完全忽略了我的二传手。

这让我发疯了,有什么主意吗?

1 个答案:

答案 0 :(得分:4)

问题在于您已将Celsius定义为old-style class

property的文档非常清楚:

  

返回新型类(从object派生的类)的属性属性。

这样做的原因是@property通过构建descriptor来工作,并且,如新类的文档所述:

  

引入新型类的主要动机是提供具有完整元模型的统一对象模型。它还具有许多实际的好处,例如可以将大多数内置类型设为子类,或者引入“描述符”,从而可以启用计算属性。


要解决此问题,只需通过继承Celsius,使object成为新样式的类:

class Celsius(object):
    # all the rest of your code is the same.

当然,如果您升级到Python 3,问题就会消失,因为 all 类都是新型类。特别是,如果您未指定任何其他基类,则将object作为基类, 1 这样class Spam:class Spam():和{{ 1}}在3.x中的含义与class Spam(object):在2.x中的含义相同。


1。这实际上是隐藏的两个更改。首先,class Spam(object):语句始终编译为对元类的调用,而不编译为特殊的旧式类构造。其次,如果您将默认元类class传递给它一个空的碱基列表,则会填写type。但是您几乎不需要了解任何这些内容,这就是为什么它出现在脚注中会伤害到您的眼睛斜视的原因。