定制自己的property问题
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=250
def getx(self):
return self._x
def setx(self,value):
self._x =value
def delx(self):
del self._x
x = MyProperty(getx,setx,delx)
self.fget = fget,self.fset = fset,self.fdel = fdel等号前面的部分应该是MyProperty类的属性,但是下面的这几个句子里fget(instance), self.fset(instance,value),self.fdel(instance),fget,fset,fdel怎么又能当函数调用?这几句是什么意思?还有就是为什么要用x和_x种写法,具体区别是什么?
请大神解惑,谢谢! 首先,这个例子展示了如何使用自定义的 MyProperty 类来实现 Python 的 property 特性。让我们先解释一下这段代码的功能,然后再回答您的问题。
MyProperty 类有三个属性:fget,fset 和 fdel,分别用于存储获取属性、设置属性和删除属性时要调用的函数。
__get__,__set__ 和 __delete__ 方法分别用于在访问、设置和删除属性时调用这些函数。
C 类有一个 _x 属性和一个 x 属性。x 属性是一个 MyProperty 实例,用于处理对 _x 属性的访问、设置和删除操作。
现在回答您的问题:
[*]在 MyProperty 类的 __get__,__set__ 和 __delete__ 方法中,self.fget,self.fset 和 self.fdel 确实是作为函数调用的。
这是因为,在初始化 MyProperty 实例时,fget,fset 和 fdel 参数接受的是函数对象。
当调用这些方法时,它们就会调用相应的函数,并传递 instance 参数。例如,self.fget(instance) 实际上调用了 C 类的 getx 方法,获取 _x 属性的值。
[*]关于 x 和 _x 的写法:在这个例子中,_x 是一个私有属性,表示 C 类的实际数据。
x 是一个 MyProperty 实例,用于处理对 _x 属性的访问、设置和删除操作。
这样做的目的是将 _x 属性的访问控制与实际数据分离,使得你可以在不修改 C 类其他部分的情况下,更改访问控制逻辑。
在实际使用中,你会看到 x 被当作一个普通属性来访问,例如 c = C(); print(c.x)。
而在内部,实际上是通过 MyProperty 实例的方法来间接访问 _x 属性。这样可以实现更好的封装和代码复用。
牛!
页:
[1]