python getattr的美妙生活

一、简介

  • 1、getattr是Python的内置函数
  • 2、用法getattr(object,“attribution”,None)
    • object: 对象
    • attribution:实例方法、或者类方法(object是一个类对象的时候)必须是str
    • None:默认值,如果没有attribution,或者没有返回值,返回默认值
一句话简介:拿到对象是的该属性

二、实例

class Test:
    age = 10

    def __init__(self):
        self.name = 'Donald'

    @staticmethod
    def sex():
        return 'man'


print(getattr(Test, 'age'))
print(getattr(Test, 'sex')())

-----
10
man
  • 1、以上是类对象,很好办,再来一个例子
a = {}
a['hello'] = 'world'
print(getattr(a, 'hello'))
-----
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'hello'
  • 2、a是一个字典对象,传入hello为什么报错?因为hello并不是a的属性,可以使用dir()查看属性:
print(dir(a))
-----
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
****
print(getattr(a, '__str__'))
print(getattr(a, '__str__')())
-----
<method-wrapper '__str__' of dict object at 0x10661faf8>
"{'hello': 'world'}"
  • 3、如果不加括号,返回的是一串内存地址,正常显示需要想调用函数一样加上()

三、扩展

__getattr__方法

  • 1 在Python中以__开头的称为魔法方法或专用方法,也有一个__getattr__方法。
  • 2 改方法仅当属性不能在实例的__dict__或其父类的 __dict__中找到时,才被调用。
class Test:
    age = 10

    def __init__(self):
        self.name = 'Donald'

    @staticmethod
    def sex():
        print('in sex')
        return 'man'

    def __str__(self):
        print('in str')
        return str(self.name)

    def __getattr__(self, item):
        return f'{item},没有这个属性,访问错误'


if __name__ == '__main__':
    p = Test()
    print(p.age)
    print(p)
    print(p.sex())
    print(p.sss)

-----
10
in str
Donald
in sex
man
sss,没有这个属性,访问错误

-3、在访问实例sss的时候,因为在实例对象和类的__dict__都找到不到,所以会调用该函数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,117评论 0 10
  • 嘉诚元年,新帝登基,大赦天下。当年落丞相一家的冤案最终得以昭雪,乱臣贼子也得到了报应,天嘉国进入开国以来最为繁盛的...
    落落青时兮阅读 1,592评论 0 0
  • 今天老师给我们讲了不能过洋节,洋人抢了我们中国的财宝,怕我们找到证据,把圆明园烧了,杀了许多中国人,因为那...
    李淑洁阅读 1,202评论 0 0