__getattr__,__setattr__,__getattribute__,__setitem__,__getitem__的日常使用

一直对这个魔法方法不是分的很清楚,后来自己逐个梳理了一下,熟悉了这家族的用法,现在结合dict类,示范一下这几类方法的具体用途和使用场景:

class Person(dict):

    def __init__(self, *args, **kwargs):
        super(Person, self).__init__(*args, **kwargs)
        self.name = "zhangsan"   
        self.age = 18

    def __getattr__(self, key, *args, **kwargs):
        print("__getattr__,key:%s" % key)

    def __setattr__(self, key, value, *args, **kwargs):
        """实例对象设置属性时,本质上是调用了__setattr__方法"""
        print("__setattr__,key:%s, value:%s" % (key, value))
        super(Person, self).__setattr__(key, value, *args, **kwargs)
        self[key] = value  # 调用__setitem__

    def __getattribute__(self, key, *args, **kwargs):
        """实例对象.属性   进行这类操作时,本质上是调用__getattribute__方法 """
        print("__getattribute__,key:%s" % key)
        return super(Person, self).__getattribute__(key, *args, **kwargs)  # 既然是获取属性的值,获取的结果肯定是返回的

    def __setitem__(self, key, value, *args, **kwargs):
        """对字典对象的键值对赋值,本质上是调用__setitem__方法"""
        print("__setitem__,key:%s, value:%s" % (key, value))
        super(Person, self).__setitem__(key, value, *args, **kwargs)
        # self.__setattr__(key, value, *args, **kwargs)

    def __getitem__(self, key, *args, **kwargs):
        """获取字典对象的key对应的值时,本质上是调用对象的___getitem__"""
        print("__getitem__,key:%s" % key)
        return super(Person, self).__getitem__(key, *args, **kwargs)


person = Person()
jillian = dict()  # 普通字典

# 类型区别
print(type(person))  # 打印实例对象的格式可以看出来,继承于dict类的子类不再是dict类型,而是基于__main__的子类,但是继承于dict类
print(type(jillian))

# get
print(person.name)  # 实例对象.属性 进行这类操作时,本质上是调用__getattribute__方法,里面已经定义了name属性,所以这里可以打印属性,没毛病
print(person['name'])  # 获取一个字典对象的key对应的值时,本质上是调用对象的___getitem__

# set
person.name = "lisi"
print(person.name)
print(person['name'])

person['age'] = 10
print(person.age)
print(person['age'])

执行结果为:

__setattr__,key:name, value:zhangsan
__setitem__,key:name, value:zhangsan
__setattr__,key:age, value:18
__setitem__,key:age, value:18
<class '__main__.Person'>
<class 'dict'>
__getattribute__,key:name
zhangsan
__getitem__,key:name
zhangsan
__setattr__,key:name, value:lisi
__setitem__,key:name, value:lisi
__getattribute__,key:name
lisi
__getitem__,key:name
lisi
__setitem__,key:age, value:10
__getattribute__,key:age
18
__getitem__,key:age
10
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,795评论 1 32
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,120评论 0 10
  • 一年一度的国家自然科学基金申请工作在3月17日本子送出后,终于可以告一段了。 可以说送上去的每一本基金申请书都凝聚...
    陈赠思阅读 3,904评论 1 2
  • 萍是我的大学舍友,也是我大学四年的搭档。我们曾彼此承诺一定要嫁给爱情! 萍的爱情开始的很美好,一次运动会的邂逅让萍...
    愿愿无违阅读 2,890评论 0 3