美文网首页
魔法方法 _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