Python-到底什么是getattr(),我该如何使用它?

发布于 2021-02-02 23:16:58

我正在阅读有关该getattr()功能的信息。问题是我仍然无法理解其用法。据我所知的唯一的事情getattr()getattr(li, "pop")相同调用li.pop

我不明白这本书何时提到你如何在运行时不知道其名称的情况下如何使用它来获取对函数的引用。总的来说,也许这是我在编程方面的菜鸟。谁能给这个问题一些启发?我什么时候以及如何使用它?

关注者
0
被浏览
74
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    getattr(object, 'x') 完全等同于object.x

    有只有两个原因使用它:

    你无法编写object.x,因为你事先不知道想要哪个属性(它来自字符串)。对于元编程非常有用。
    你想要提供一个默认值。如果没有object.y则将引发一个。但是会回来的。AttributeErrorygetattr(object, 'y', 5)5



  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    Python中的对象可以具有属性-数据属性和与之配合使用的方法(方法)。实际上,每个对象都有内置的属性。

    例如你有一个对象person,一个具有多个属性:name,gender,等。

    你可以访问这些属性(无论是方法或数据对象),通常写作:person.name,person.genderperson.the_method()等。

    但是,如果在编写程序时不知道属性名称怎么办?例如,你将属性名称存储在名为的变量中attr_name。

    如果

    attr_name = 'gender'
    

    然后,而不是写

    gender = person.gender
    

    你可以写

    gender = getattr(person, attr_name)
    

    一些实践:

    Python 3.4.0 (default, Apr 11 2014, 13:05:11)
    
    >>> class Person():
    ...     name = 'Victor'
    ...     def say(self, what):
    ...         print(self.name, what)
    ... 
    >>> getattr(Person, 'name')
    'Victor'
    >>> attr_name = 'name'
    >>> person = Person()
    >>> getattr(person, attr_name)
    'Victor'
    >>> getattr(person, 'say')('Hello')
    Victor Hello
    

    getattrAttributeError如果对象中不存在具有给定名称的属性,则将引发:

    >>> getattr(person, 'age')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Person' object has no attribute 'age'
    

    但是你可以传递一个默认值作为第三个参数,如果该属性不存在,则将返回该默认值:

    >>> getattr(person, 'age', 0)
    0
    

    你可以使用getattr和dir来迭代所有属性名称并获取它们的值:

    >>> dir(1000)
    ['__abs__', '__add__', ..., '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
    
    >>> obj = 1000
    >>> for attr_name in dir(obj):
    ...     attr_value = getattr(obj, attr_name)
    ...     print(attr_name, attr_value, callable(attr_value))
    ... 
    __abs__ <method-wrapper '__abs__' of int object at 0x7f4e927c2f90> True
    ...
    bit_length <built-in method bit_length of int object at 0x7f4e927c2f90> True
    ...
    
    >>> getattr(1000, 'bit_length')()
    10
    

    一个实际的用途是查找所有以其名称开头test并调用它们的方法。

    类似getattr还有setattr它允许你设定有其名称的对象的属性:

    >>> setattr(person, 'name', 'Andrew')
    >>> person.name  # accessing instance attribute
    'Andrew'
    >>> Person.name  # accessing class attribute
    'Victor'
    >>>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看