property管理的属性是虚拟属性?

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)将无限循环。

阅读 2.2k
1 个回答
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 这个函数

所以你会一直不断的死循环。参考这个答案解释: https://segmentfault.com/q/1010000044061650?_ea=312080437

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进