鱼C论坛

 找回密码
 立即注册
查看: 1622|回复: 2

[已解决]定制自己的property问题

[复制链接]
发表于 2023-4-9 19:19:57 | 显示全部楼层 |阅读模式

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

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

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=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种写法,具体区别是什么?
请大神解惑,谢谢!
最佳答案
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 属性。这样可以实现更好的封装和代码复用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 属性。这样可以实现更好的封装和代码复用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-9 19:38:43 | 显示全部楼层
牛!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 21:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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