美文网首页Python
python getattr的美妙生活

python getattr的美妙生活

作者: Donald_32e5 | 来源:发表于2019-02-13 21:16 被阅读0次

    一、简介

    • 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 getattr的美妙生活

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