鱼C论坛

 找回密码
 立即注册
查看: 1975|回复: 6

代码求解释

[复制链接]
发表于 2021-3-22 17:48:41 | 显示全部楼层 |阅读模式

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

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

x
下面是一段描述符类的代码
class MyDescrpr:                        #定义一个描述符类
    def __init__(self, value = 'X-man!'):        
        self.value = value
   
    def __get__(self, instance, owner):
        print('getting... ', self, instance, owner)
        return self.value

    def __set__(self, instance, value):
        print('setting... ', self, instance, value)
        self.value = value

class Test:
    d = MyDescrpr()

t = Test()               
print(t.d)               
t.d = 5
print(t.d)

以下是输出结果:
==================== RESTART: F:/python/desper.py ===================
getting...  <__main__.MyDescrpr object at 0x0000000002D30520> <__main__.Test object at 0x0000000002F99FA0> <class '__main__.Test'>
X-man!
setting...  <__main__.MyDescrpr object at 0x0000000002D30520> <__main__.Test object at 0x0000000002F99FA0> 5
getting...  <__main__.MyDescrpr object at 0x0000000002D30520> <__main__.Test object at 0x0000000002F99FA0> <class '__main__.Test'>
5

有一点还是不太理解,在Test类中,d是一个描述符类的对象,为什么能对一个对象进行直接赋值呢,为什么不能像其他普通的类一个,直接为其新建一个属性并赋值,比如:
>>> t.d.y = 3
这里会报错:
getting...  <__main__.MyDescrpr object at 0x0000000002D30520> <__main__.Test object at 0x0000000002F99FA0> <class '__main__.Test'>
Traceback (most recent call last):
  File "<pyshell#96>", line 1, in <module>
    t.d.y = 3
AttributeError: 'int' object has no attribute 'y'


而在普通的类中:
class A:
    pass

class B:
    a = A()

b = B()
b.a.x = 1                        # 这样赋值是允许的
print(b.a.x)

输出结果:  1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-22 18:03:16 | 显示全部楼层
t.d = 5; d是int类型, int类型没有属性y
t.d = Test() ;
t.d.y = 3;这样就行啦。 d的类型为 Test的实例
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 18:48:54 | 显示全部楼层
我只知道是因为,你重写了MyDescrpr里边的get方法
时间有点久了,忘了__get__()原本是怎么运作的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-22 22:00:40 | 显示全部楼层
MachineGirl 发表于 2021-3-22 18:48
我只知道是因为,你重写了MyDescrpr里边的get方法
时间有点久了,忘了__get__()原本是怎么运作的了

嗯,也许这就是描述符类的特别之处吧。

查了一点资料,对这个问题有一点粗浅的认识,也加深对“python万物皆对象”的理解。

>>> a = 2
>>> type(a)
<class 'int'>     #可见整形也是一个类,给一个变量赋整数值,相当于实例化int类的一个对象

描述符类定义了__get__()方法,调取该类的对象时会python会自动该重写后的方法,并将对象类型确定为该方法的返回值类型。

从这个意义上讲,这里的t.d = 5和没有定义任何符类时没有什么区别。

一旦被赋值,类型自然就确定了,整型当然是没有y属性的,所以才会报错 'int' object has no attribute 'y'。

而在下面的那个例子中,b.a返回的是一个普通的类的对象,当然可以为它赋任何类型的值。

不知道说的对不对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-22 22:02:47 | 显示全部楼层
Cool_Breeze 发表于 2021-3-22 18:03
t.d = 5; d是int类型, int类型没有属性y
t.d = Test() ;
t.d.y = 3;这样就行啦。 d的类型为 Test的实例

是这样的。只是里面用到的描述符类运行的内部机制还不是理得太明白,所以有点困惑。谢谢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 23:04:01 | 显示全部楼层
需要实现对应的魔法方法,我没记错的应该是settar  好像是这个,实现之后就可以设置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-24 08:22:06 From FishC Mobile | 显示全部楼层
谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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