使用描述符来管理属性:
class Geeks:
def __init__(self,value):
self.age = value
def __getattribute__(self,attr):
return object.__getattribute__(self,attr)
def __setattr__(self,attr,value):
return object.__setattr__(self, attr,value)
用真实属性初始化
Geeks
类age
10:
boy = Geeks(10)
boy.age
10
boy.__dict__
{'age': 10}
实例
boy
包含真实属性age
。property
类来管理 age
属性(有些以 self.__age
或 self.age_
或 self._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)
boy.age
10
boy.__dict__
{'_age': 10}
真正的属性是
_age
,不是age
,_age
是age
的代理,它是一种虚拟属性。我在用RecursionError
创建真实的
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):
return self.age = value
age = property(get_age, set_age)
同样的错误:
class Geeks:
def __init__(self,value):
self.age = value
def get_age(self):
return object.__getattribute__(self,'age')
def set_age(self, value):
object.__setattr__(self, 'age',value)
age = property(get_age, set_age)
如何使
property(get_age, set_age)
创建真正的属性age
,而不是_age
或类似的东西?
class Geeks:
def __init__(self,value):
self.age = value
def get_age(self):
return self.__dict__['age']
def set_age(self, value):
self.__dict__['age'] = value
age = property(get_age, set_age)
类
Geeks
可以创建一个真实的属性,属性名称与__dict__
中的相同。
boy = Geeks(10)
in set
boy.age
in get
10
boy.__dict__
{'age': 10}