python的属性设置
python的属性设置
python中的属性管理由
__dict__存储
__getattr__与__getattribute__
区别
__getattr__在访问不存在的成员时才会触发,可以用来做部分异常处理__getattribute__则拦截所有对属性的访问(包括对__dict__的访问),如果class同时定义了__getattr__和__getattribute__,__getattr__不会生效 ```python In [29]: class Test(object): …: def init(self,name): …: self.name=name …: def getattr(self,args,kwargs): …: if ‘age’ in args: …: return 20 …: def __setattr__(self,*args,kwargs): …: return object.setattr(self,args,**kwargs) …: …:
In [30]: t=Test(‘haha’)
In [31]: t.dict Out[31]: {‘name’: ‘haha’}
In [32]: t.age Out[32]: 20
In [33]: t.age=100
In [34]: t.age O ut[34]: 100
In [35]: t.dict Out[35]: {‘age’: 100, ‘name’: ‘haha’}
1
2
3
4
5
6
7
8
9
10
11
12
13
`__getattribute__`只有新式类才生效,继承自`object`的类
## `__setattr__`
每当属性被赋值的时候, `__setattr__()` 会被调用,所以有可能造成递归调用,比如:
```python
#wrong
def __setattr__(self, name, value):
self.name = value
#right
def __setattr__(self, name, value):
self.__dict__[name] = value
一般来说都是在获取某个属性的时候做特殊处理或限制,设置属性时很少会涉及。
本文由作者按照 CC BY 4.0 进行授权