#独家
property管理的属性是虚拟属性?

2023-08-06 0 967
class Geeks:
     def __init__(self,value):
          self._age = value  
     def get_age(self):
         return self._age       
     def set_age(self, value):
         self._age = value 
     age = property(get_age, set_age) 

创建了一个类,里面的age属性由property进行管理。

boy = Geeks(10)
boy.age
10
boy.__dict__
{'_age': 10}

你看字典里面的值是_age不是age,如果修改类

class Geeks:
     def __init__(self,value):
          self.age = value  
     def get_age(self):
         return self.age       
     def set_age(self, value):
         self.age = value 
     age = property(get_age, set_age) 

boy = Geeks(10)将无限循环。

class Geeks:
     def __init__(self,value):
          self.age = value  
     def get_age(self):
         return self.age       
     def set_age(self, value):
         self.age = value 
     age = property(get_age, set_age) 

这段代码把 age = property(get_age, set_age) 换个写法就是:

class Geeks:
    def __init__(self, value):
        self.age = value

    def get_age(self):
        return self.age

    def set_age(self, value):
        self.age = value
    
    # 改写
    @property
    def age(self):
        return self.age

    @age.setter
    def age(self, val):
        self.age = val

这样会造成命名空间污染,当实例和类属性命名相同,且是描述符的时候,描述符在属性查找的优先级上最高。所以当你用 book = Geeks(10) 的时候,执行了 self.age = value,其实就等于一直在调用:

def set_age(self, value):    # 实例化的时候会调用这个描述符
    self.age = value    # 调用这行又是调用 set_age 这个函数
所以你会一直不断的死循环
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 property管理的属性是虚拟属性? https://www.jkxiazai.com/2418.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务