spflmm 发表于 2023-4-9 19:19:57

定制自己的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种写法,具体区别是什么?
请大神解惑,谢谢!

isdkz 发表于 2023-4-9 19:22:40

首先,这个例子展示了如何使用自定义的 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 属性。这样可以实现更好的封装和代码复用。

spflmm 发表于 2023-4-9 19:38:43

牛!
页: [1]
查看完整版本: 定制自己的property问题