鱼C论坛

 找回密码
 立即注册
查看: 115|回复: 3

[技术交流] 关于property应用问题

[复制链接]
发表于 2024-10-23 21:43:04 | 显示全部楼层 |阅读模式

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

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

x
现有如下一段代码:
class Myproperty:
    def __init__(self,fget = None,fset = None,fdel = None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel

    def __get__(self,instance,owner):
        return self.fget(instance)
   
    def __set__(self,instance,value):
        self.fset(instance,value)
        
    def __delete__(self,instance):
        self.fdel(instance)


class C:
    def __init__(self):
        self._x = None

    def getX(self):
        print('getX')
        return self._x
   
    def setX(self,value):
        print('setX')
        self._x = value

    def delX(self):
        print('delX')
        del self._x
  
    x = Myproperty(getX,setX,delX)

当运行如下代码时:
>>>c1 = C()
>>>c1.x = 'blue'
>>>setX
>>>c1.x
>>>
getX
'blue'
>>>c1._x
>>>'blue'

疑问: 当执行c1._x时, 为何其值也变为'blue', 而且不在打印'getX', 这是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-23 21:44:12 | 显示全部楼层
在您的代码中,`c1.x` 的访问和修改是通过 `Myproperty` 类的描述符方法来处理的。具体来说:

1. 当执行 `c1.x = 'blue'` 时,调用的是 `__set__` 方法,这会触发 `setX` 方法,将 `'blue'` 赋值给 `self._x`,所以 `_x` 的值变为 `'blue'`。

2. 当访问 `c1.x` 时,调用的是 `__get__` 方法,这里会触发 `getX` 方法,因此打印 `'getX'` 并返回 `_x` 的值。

3. 直接访问 `c1._x` 属于对实例属性的直接访问,不通过 `Myproperty` 的描述符方法,因此不会调用 `getX`,也不会打印 `'getX'`,只是简单地返回存储在 `_x` 中的值 `'blue'`。

总结一下,`c1._x` 的访问不涉及描述符,所以不会调用 `getX`。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-23 21:58:42 | 显示全部楼层
1. 当执行 `c1.x = 'blue'` 时,调用的是 `__set__` 方法,为什么这会触发 `setX` 方法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-23 21:58:50 | 显示全部楼层
鬼少 发表于 2024-10-23 21:58
1. 当执行 `c1.x = 'blue'` 时,调用的是 `__set__`  ...


这是因为在 `Myproperty` 描述符的 `__set__` 方法中,明确地调用了 `self.fset(instance, value)`。在您定义 `x` 这个 `Myproperty` 实例的时候,传递的 `fset` 参数就是 `setX` 方法。因此,当 `__set__` 被调用时,实际上就是在调用 `setX` 方法。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 12:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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