python __setattr__

1.__setattr__()是在属性赋值时被访问,比如我们调用instance.x=1时,并将x存储到__dict__

class Person(object):
    def __init__(self):
        self.name = "wang"
        self.age = 18
        self.male = True
        
    def __setattr__(self, key, value):
        print("*"*50)
        print("setting:{},  with:{}".format(key, value))
        print("current __dict__ : {}".format(self.__dict__))
        return object.__setattr__(self,key,value) # 因为子类重写父类方法,所以要返回父类该方法完成在__dict__的注册,父类的__setattr__本质上是完成了·self.__dict__[key] = value·
person = Person()

由于return在print之后,所以打印的结果会错一步。

2.注意下例中不能使用self.dict = {},会出现递归调用

class Foo(object):

    def __init__(self):
        object.__setattr__(self, 'dict', {})
        # self.dict = {}  # 会调用setattr,递归调用错误

    def __setattr__(self, key, value):
        self.dict = {'k1':'v1'}
        print(key,value)

    def __getattr__(self, item):
        print(item)
        return 'df'


obj = Foo()

# obj.x = 123
# 对象.xx setattr会执行


3.setattr应用:
1.将字典转换为类的属性

class Foo(object):
    def __init__(self):
        self.values = {
            'x':'wang',
            'y':'wei',
        }
        for k,v in self.values.items():
            setattr(self,k,v)
obj = Foo()
print(obj.x)

参考:
https://zhuanlan.zhihu.com/p/101004827?from_voters_page=true

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值