Python忽略setter

Python忽略setter,python,object,attributes,python-2.x,python-2.6,Python,Object,Attributes,Python 2.x,Python 2.6,我是python新手,我尝试创建一个属性为get/set的类。我从internet复制了一个简单的示例,Python似乎忽略了我的setter。我正在做一些非常愚蠢的事情,因为我不明白为什么它不起作用 我正在Linux上运行python 2.6.6 谢谢 #!/usr/bin/python class Celsius: def __init__(self, temperature = 0): self._temperature = temperature de

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

我正在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
#/usr/bin/python
摄氏度等级:
def _初始(自身,温度=0):
自身温度=温度
def至华氏温度(自身):
返回(自身温度*1.8)+32
@财产
def温度(自身):
打印(“获取价值”)
返回自身温度
@温度调节器
def温度(自身、数值):
如果值<-273:
提升值错误(“温度不可能低于-273”)
打印(“设置值”)
自身温度=数值
c=摄氏度()
c、 温度=-5555
打印温度
我在命令行中唯一拥有的就是它的print-5555。它完全忽略了我的二传手


这快把我逼疯了,有什么想法吗?

问题是你把
摄氏度定义为

属性
的文档非常清楚地说明了这一点:

返回新样式类(从
对象派生的类
)的属性属性

原因是
@property
通过构建一个

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


要解决此问题,只需通过继承
对象
,使
成为一个新样式的类:

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

当然,如果升级到Python3,问题就会消失,因为所有类都是新样式的类。特别是,如果您不指定任何其他基类,您将得到
对象
作为基类,1因此
类垃圾邮件:
类垃圾邮件():
,和
类垃圾邮件(对象):
在3.x中的含义与
类垃圾邮件(对象):
在2.x中的含义相同



一,。这实际上是两个隐藏的变化。首先,
class
语句总是编译为对元类的调用,而不是对特殊的旧式类构造的调用。其次,如果向默认元类传递一个空的基列表,则默认元类
type
,将填充
(object,)
。但是你几乎不需要理解这些东西,这就是为什么它出现在一个脚注中,会让你眯着眼睛看。

问题是你把
摄氏度定义为

属性
的文档非常清楚地说明了这一点:

返回新样式类(从
对象派生的类
)的属性属性

原因是
@property
通过构建一个

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


要解决此问题,只需通过继承
对象
,使
成为一个新样式的类:

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

当然,如果升级到Python3,问题就会消失,因为所有类都是新样式的类。特别是,如果您不指定任何其他基类,您将得到
对象
作为基类,1因此
类垃圾邮件:
类垃圾邮件():
,和
类垃圾邮件(对象):
在3.x中的含义与
类垃圾邮件(对象):
在2.x中的含义相同



一,。这实际上是两个隐藏的变化。首先,
class
语句总是编译为对元类的调用,而不是对特殊的旧式类构造的调用。其次,如果向默认元类传递一个空的基列表,则默认元类
type
,将填充
(object,)
。但是你几乎不需要理解这些东西,这就是为什么它出现在一个脚注中,让你眯着眼睛看它的原因。

属性不适用于旧样式的类。如果您不是从其他任何东西继承,那么从
对象继承。有什么原因需要在2018年使用Python 2.6吗?Python 2.7,我可以理解,但是2.6已经超过EOL大约6年了,我认为对它保持向后支持的上一个发行版今年早些时候到期了。属性不能与旧式类一起使用。如果您不是从其他任何东西继承,那么从
对象继承。有什么原因需要在2018年使用Python 2.6吗?Python 2.7,我可以理解,但是2.6已经超过了EOL大约6年了,我认为最后一个维护向后支持它的发行版今年早些时候到期了。@user3483203是的。让我更新答案,让它更清楚。该死,我花了一个下午,我所要做的就是添加(对象)。谢谢@用户3483203是的。让我更新答案,让它更清楚。该死,我花了一个下午,我所要做的就是添加(对象)。谢谢