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 这个函数 所以你会一直不断的死循环