我是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。它完全忽略了我的二传手。
这让我发疯了,有什么主意吗?
答案 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
。但是您几乎不需要了解任何这些内容,这就是为什么它出现在脚注中会伤害到您的眼睛斜视的原因。