Python - 在哪里准确使用getattr?它与其他人有什么不同?

时间:2015-08-04 05:22:49

标签: python

li = ['good', 'bad']

li.pop()
getattr(li, "pop")(1)

以上两个操作都会产生与它们之间的差异完全相同的结果。

正如我在getstr方法的docs定义中所读到的那样,提到 - 你可以在不知道它的名字的情况下获得对函数的引用直到运行时。

但是我们这里也采用'pop'函数名称。他们之间到底有什么区别?

请告诉我真实用法?

3 个答案:

答案 0 :(得分:2)

getattr()不仅适用于methods,还可以访问attributes,示例 -

>>> class CA:
...     def __init__(self):
...             self.a = 10
...
>>> c = CA()
>>> getattr(c,'a')
10

Amd getattr()在这种情况下正常使用,当您不知道要访问的属性时,直到运行时。

因此,假设属性名称是作为来自某个文件的字符串或作为用户输入或其他来源进入的,那么获取属性值的最佳方法是使用getattr()方法。 / p>

对于你的pop()案例,作为一个非常简单的例子(仅出于教育目的,你不应该在实际代码中使用这样的东西,因为它很危险),假设你想要你想要的功能要作为用户的输入运行(在l1上),运行该函数的方式将使用getattr,示例 -

>>> li = ['good', 'bad']
>>> funcToRun = input("Which method :
Which method : pop
>>> getattr(li, funcToRun)()
'bad'

以上只是一个例子。

答案 1 :(得分:2)

Python中的对象可以具有属性。例如,您有一个对象person,它有几个属性:namegender等。您可以通过以下方式访问这些属性(无论是方法还是数据对象):{{1} },person.nameperson.gender

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

如果

gender_attribute_name

然后,而不是写

attr_name = 'gender'

你可以写

gender = person.gender

一些练习:

gender = getattr(person, attr_name)

同样>>> 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 >>> 有一个第三个可选参数,它有时非常有用,可以防止出现愚蠢的异常。就像getattr()attr不存在一样,然后将第三个参数作为值(或默认值)返回。

示例:

object

答案 2 :(得分:0)

当属性名称来自其他程序,来自用户输入或未提前知道时,此功能派上用场。

在给定对象中检查属性是否存在也是很好的。

当然,你的用例有点微不足道,但想象一下如果你正在处理一些复杂的类并且你不确定它是否已经实现some_method_x,getattr是确保属性存在的一种方法。 / p>

它还具有内置的优点,就像大多数内置的一样,它适用于所有对象。