鱼C论坛

 找回密码
 立即注册
查看: 1396|回复: 4

关于Python描述符的困惑,请大神赐教

[复制链接]
发表于 2018-2-9 19:36:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在“零基础入门学习Python”的第46课“描述符”这一节中,小甲鱼写的摄氏度和华氏度转换的案例:
class Celsius:
    def __init__(self,value = 26):
        self.value = float(value)
    def __get__(self,instance,owner):
        return self.value
    def __set__(self,instance,value):
        self.value = 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:
    cel = Celsius()
    fah = Fahrenheit()

存在的问题是,如果给Temperature两个实例化对象:
t1 = Temperature()
t2 = Temperature()
则对t2的赋值操作会影响t1:
t1.fah = 1
t2.fah = 2
t1.fah
2

原因是,在定义Celsius()的过程中,self指代的是描述符类Celsius()的实例化对象,而t1、t2的Temperature()实例对象也就是instance不同,但Celsius()的实例对象相同,所以self.value = value操作会改变所有Temperature()实例对象的值。
我试图用instance来改写Celsius()类,但没有成功,请大神给我指引,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-2-9 20:57:48 | 显示全部楼层
让t1在 t1下输出
t2在t2下输出
要不然他的变量会一块变 因对对象是可变类型
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 21:06:34 | 显示全部楼层
是指不同类实例使用同一个值吗?
如果是
少年类变量、实例变量了解下
  1. class Celsius:
  2.     def __init__(self,value = 26):
  3.         self.value = float(value)
  4.     def __get__(self,instance,owner):
  5.         return self.value
  6.     def __set__(self,instance,value):
  7.         self.value = value

  8. class Fahrenheit:
  9.     def __get__(self,instance,owner):
  10.         return instance.cel *1.8 +32
  11.     def __set__(self,instance,value):
  12.         instance.cel = (float(value)-32)/1.8
  13.         
  14. class Temperature:
  15.     def __init__(self):
  16.         cel = Celsius()
  17.         fah = Fahrenheit()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-10 13:32:53 | 显示全部楼层
lies_for_L 发表于 2018-2-9 21:06
是指不同类实例使用同一个值吗?
如果是
少年类变量、实例变量了解下

少年类变量是什么?
而且修改后的代码还是不行:
>>> t1 = Temperature()
>>> t1.cel
Traceback (most recent call last):
  File "<pyshell#172>", line 1, in <module>
    t1.cel
AttributeError: 'Temperature' object has no attribute 'cel'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-10 14:42:49 | 显示全部楼层
MonkeyDLazy 发表于 2018-2-10 13:32
少年类变量是什么?
而且修改后的代码还是不行:
>>> t1 = Temperature()

他说的难道不是类变量和实例变量么,断句没断好,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-30 05:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表