|
发表于 2018-7-9 18:40:22
|
显示全部楼层
P100
最后一行:
fah = Fahrenheit() 没有缩进。
关于这个例子,我的思考如下:
定义的 Celsius类中:
__get__ 和 __set__ 函数中,不应该是 self.value,应该为 instance.value。
原因是self是描述符类自身的实例。instance 才是描述符拥有者所在的类(即 Temperature )的实例。
value 属性为 Celsius 实例对象所有。而 Temperature 类的实例对象没有属性,逻辑上有些不符合常理。
无论 Temperature 有几个实例,实例本身并没有 cel 和 fah 属性。
测试如下
>>>temp1 = Temperature()
>>>temp2 = Temperature()
>>>temp1.cel
26.0
>>>temp1.fah
78.80000000000001
>>>temp2.cel
26.0
>>>temp1.cel = 36
>>>temp2.cel
36.0
>>>temp1.__dict__
{}
>>>temp2.__dict__
{}
>>>Celsius().__dict__
{'value': 26.0}
建议在Temperature类中定义属性 cel 和 fah 的初始化,仅把 Celsius 和 Fahrenheit 作为一个描述符类,
像 property 一样,仅作为一个工具。就像使用 property()函数一样,理解起来更符合常理。
修改代码如下:
class Celsius:
def __get__(self,instance,owner):
return instance.value
def __set__(self,instance,value):
instance.value = float(value)
class Fahrenheit:
def __get__(self, instance, owner):
return instance.cel * 1.8 + 32
def __set__(self, instance, value):
instance.cel = (float(value) - 32) / 1.8
class Temperature:
def __init__(self,value = 26):
self.cel = float(value)
self.fah = self.cel * 1.8 + 32
cel = Celsius()
fah = Fahrenheit()
测试如下:
>>>temp1 = Temperature()
>>>temp2 = Temperature()
>>>temp1.cel
26.000000000000007
>>>temp2.cel
26.000000000000007
>>>temp1.cel = 35
>>>temp2.cel
26.000000000000007
>>>temp1.__dict__
{'value': 35.0}
>>>temp2.__dict__
{'value': 26.000000000000007}
>>>Celsius().__dict__
{} |
|