三少爷的jian 发表于 2017-4-14 09:21:29

这段代码是怎么运行的呢

classMyProperty:
    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)

三少爷的jian 发表于 2017-4-14 09:44:21

还有x前面如果不加 _ 就会变成一个死循环 为什么呢?新手不懂啊啊啊啊

zlj19931010 发表于 2017-4-14 09:59:46

本帖最后由 zlj19931010 于 2017-4-14 10:18 编辑

给class C定义一个x属性,x是你自定义类MyProperty的实例,
x = MyProperty(getX,setX,delX)
MyProperty中
当要获取x值的时候触发__get__()执行class C中的getX函数 c.x
当要修改x值的时候触发__set__()执行class C中的setX函数        c.x = 12
当要删除x值的时候触发__delete__()执行class C中的delX函数        del c.x

>>> c = C()
>>> c.x = 1
>>> c.x
'haha1'
>>> del c.x



还有x前面如果不加 _ 就会变成一个死循环 为什么呢?新手不懂啊啊啊啊
同名了肯定循环,比如
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)

init中的self._x = None触发setX函数
setX中 self._x = value,又触发setX,就循环了

具体小甲鱼有详细的解释http://bbs.fishc.com/forum.php?mod=viewthread&tid=51106&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403
页: [1]
查看完整版本: 这段代码是怎么运行的呢