38.Python进阶_魔法方法_自定义属性__setattr__和__delattr__

  • 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__方法,被拦截的属性无法被删除;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值