美文网首页
魔法方法 _setitem_, _setattr_, _geti

魔法方法 _setitem_, _setattr_, _geti

作者: 木语沉心 | 来源:发表于2020-03-14 15:51 被阅读0次
  • _setitem_() 和 _setattr_()的区别
  • _getitem_() 和 _getattr_()的区别

1. _setitem_() 和 _setattr_()的区别

_setitem_ 是所有属性赋值时的内置初始语句, 若要自定义对象属性赋值方式则使用该方法
_setattr_是字典类型赋值时的内置初始语句, 若要自定义类似字典的赋值方式则使用该方法

示例:

class Method(object):


    def __setattr__(self, key, value):
        print('调用了setattr')
        self.__dict__[key] = value

    def __setitem__(self, key, value):
        print('调用了setitem')
        self.__dict__[key] = value

    def __delitem__(self, key):
        del self.__dict__[key]

m = Method()
m.age = 1  # 调用__setattr__ 方法
# m['name'] = 'tom'  # 调用 __setitem__ 方法
# del m['name']
print(m.__dict__)
# 若注释__setattr__方法则使用的是初始Method类自带的__setattr__方法

2. _getitem_() 和 _getattr_()的区别

同上get就是获取对象属性的方法, _getattr_也是很多设计模式的一种灵活应用
比如懒加载, 动态导入模块.

示例:

class Student:

    def __getattr__(self, item):
        
        return item + 'set a new value'
 
    def __getitem__(self, item):
        return self.__dict__[item]
 
    def __setitem__(self, key, value):
        self.__dict__[key] = value

s = Student()

print(s.name)  # 调用__getattr__方法 输出'name set a new value'

s.name = 'billy'
print(s.name)  # name 已存在 不调用__getattr__方法

s.age = 18  # 调用__setattr__ 方法
print(s.age)  
print(s['age'])  # 调用 __getitem__方法 输出18

s['name'] = 'billy'  # 调用 __setitem__ 方法
print(s['name'])  # 调用 __getitem__ 方法 输出 'billy'

相关文章

网友评论

      本文标题:魔法方法 _setitem_, _setattr_, _geti

      本文链接:https://www.haomeiwen.com/subject/flxvshtx.html