- setattr(对象名,属性名,属性值) 设置属性
- getattr(对象名,属性名) 获取属性
- delattr(对象名,属性名) 删除属性
先看一个设置属性的情况;
class Hero():
def __init__(self,name):
self.name = name
h = Hero('静静')
h.age = 18
setattr(h,'gender','女') #设置属性
print(getattr(h,'age')) #获取属性
del h.age
delattr(h,'name') #删除属性
print(h.__dict__)
运行结果:
18
{'gender': '女'}
看一个__setter__魔法方法的使用
当实例给属性进行赋值时,就会调用,被赋值的属性和值会存入实例属性字典__dict__中
class Hero():
def __init__(self,name):
self.name = name
def __setattr__(self, key, value):
'''给设置属性时,会调用此方法'''
print(self)
print(key)
print(value)
print('---__setattr__--')
object.__setattr__(self, key, value)
h = Hero('静静')
print(h.name)
```python
运行结果:
<main.Hero object at 0x00000140173094C8>
name
静静
—setattr–
静静
由运行结果可知,当属性被赋值时,就会自动调用 __setattr__方法;
##### 给特殊属性设置固定值 __setattr__属性设定:
```python
class Hero():
def __init__(self,name):
self.name = name
def __setattr__(self, key, value):
'''给设置属性时,会调用此方法'''
if key == 'name':
value = '888'
print('---__setattr__--')
object.__setattr__(self, key, value)
h = Hero('静静')
setattr(h,'age',18)
print(h.name)
print(h.age)
运行结果:
---__setattr__--
---__setattr__--
888
18
在__setattr__
中设置了固定值,后面无论如何赋值,都会去使用__setattr__
中的固定值;
属性删除 __delattr__拦截
class Hero():
def __init__(self,name):
self.name = name
def __delattr__(self, item):
print(f'这个是item:{item}')
if item == 'name':
pass
else:
object.__delattr__(self,item)
h = Hero('静静')
setattr(h,'age',18)
delattr(h,'name')
print(h.__dict__)
delattr(h,'age')
print(h.__dict__)
运行结果:
这个是item:name
{'name': '静静', 'age': 18}
这个是item:age
{'name': '静静'}
可见进行了删除拦截,删除属性时,会调用__delattr__方法,被拦截的属性无法被删除;