wangqiuqiu_123 2019-10-10 16:51 采纳率: 0%
浏览 324

python中描述符的理解

1.代码是很基础的,自定义一个描述符中执行过程不理解,望高手解答!!!

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):
        return self._x
    def setX(self,value):
        self._x = value
    def delX(self):
        del self._x

    x=MyProperty(getX,setX,delX)

3.执行:

c=C()
c.x='X-man'

3.问题描述:
在执行c.x='X-man'后,此时self.fset = setX,则self.fset(instance,value)实际等同于setX(c,'X-man'),这样也能运行吗?不是应该是c.setX('X-man')吗?

  1. 问题补充: 谢谢大家的解答,但是见下面的程序:
class A:
    def qiu2(self,y):
        print('调用了qiu2')
        return  y*y
    def qiu1(self,x):
        print(x(self,5))         ##此处为疑惑点

执行

a=A()
a.qiu1(qiu2)
Traceback (most recent call last):
File "", line 1, in
a.qiu1(qiu2)
NameError: name 'qiu2' is not defined

#####按照大家的解答,x = qiu2 , 那x(self,5)应该也能调用成功的,可是会报错。然后将疑惑点改成print(self.x(5))运行仍然会出错,错误仍然是'qiu2'没有定义。为什么之前的代码能实现,而此处行不通呢?困扰几天了,希望大神能解答。

  • 写回答

2条回答 默认 最新

  • JonathanYan 2019-10-10 16:59
    关注

    setX虽然从形参的角度使用时应该是setX(c,'X-man'),但是都是写成c.setX('X-man')这样的写法,这是等价的。

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?