python 对象使用.和[]方式添加属性原理

目录

一、问题来源        

二、思考

三、实现代码


一、问题来源        

发现ml_collections的ConfigDict实例对象,可以通过对象名.属性名的方法添加新的属性,也能够通过对象名[属性名]的方式来添加新的元素。感到很好奇,因为ConfigDict看上去就是一个普通的类。

二、思考

        查阅资料发现:其实通过.进行添加新的属性的方法是通过__setattr__魔法方法;而通过[]添加新的属性是通过__setitem__魔法方法。

三、实现代码

        

class A:
    def __init__(self, data):
        # 这个赋值方式,是通过__setattr__魔法方法,把dic属性添加到__dict__字典中
        # 所以__setattr__想要对dic中添加key-value要先把它加入__dict__
        self.dic = data

    def __setattr__(self, key, value):
        if 'dic' not in self.__dict__:
            self.__dict__['dic'] = {}
        else:
            self.dic.update({key: value})
        # 这就是错误的方式,因为到__setattr__方法里面,是还没有dic这个属性的
        # self.dic.update({key,value})

    def __setitem__(self, key, value):
        self.dic.update({key:value})

if __name__=="__main__":
    a = A({'age':18})
    # [] 添加属性是使用__setitem__方法
    a['birthday'] = '2021-10-1'
    # 下面两个添加属性是使用__setattr__方法
    a.address = '北京'
    a.name = "张三"
    print(a.dic)
    
// 输出
{'birthday': '2021-10-1', 'address': '北京', 'name': '张三'}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值