在getattr()中有两个参数是什么意思?

时间:2014-04-22 10:41:50

标签: python

从python官方文档中,我看到了getattr();

的正常表达式

getattr(object,name [,default])

我理解得很清楚。例如,我可以这样做:

>>> def a():
...     pass
...
>>> c = 2
>>> getattr(a, 'b', c)
2

但是在我现在查看的代码中,作者使用了如下模式:

getattr(a, b.x)(b.y)

我甚至没有找到' b'在' a'对象!

这让我很困惑,这段代码意味着什么?


附录1:

getattr()介于大量的import语句之间。 最初的表达方式如下:

 from tornado.options import define, options
 import settings      

 getattr(settings, options.env)(options.server_name)

4 个答案:

答案 0 :(得分:2)

b是一个对象,而不是文字。此代码的作者说“将a的属性命名为b.x,其名称由b.y提供,并将其称为传递{{1}}是什么”。

答案 1 :(得分:1)

作者正在调用一个函数。以下内容:

getattr(a, b.x)(b.y)

从对象a获取属性。作者有一个对象b,它至少有两个属性x and y。他从a获取了一个属性,其名称与b.x相同。这显然是一个他用一个参数调用的函数,一个来自b.y

的值

简化示例:

>>> class Ex(object):
...     def foo(self, val):
...         """ b.x has the string "foo", which is the name of this method """
...         print val # <-- b.y 
...         
...     
... 
>>> class B(object):
...     def __init__(self, x, y):
...         self.x = x
...         self.y = y
...         
...     
... 
>>> a = Ex()
>>> b = B("foo", 1)
>>> getattr(a, b.x)(b.y)
1

在上面的示例中,我们从对象a获取了一个名为foo的方法。请注意,b.x值为"foo"b.y1,已作为a.foo()传递给val

答案 2 :(得分:0)

b.x是包含字符串的某个属性。没有什么特别的,它只是一个变量,而不是你的第一个例子中的常量'b'。 写在不止一行:

name = b.x
func = getattr(a, name) # get the function by name
result = func(b.y) # call the function

答案 3 :(得分:0)

他必须做类似这样的事情:

>>> a = 10
>>> class B:
...  def __init__(self, y):
...    self.y = y
...  def x(self, y):
...   return y
... 
>>> b = B(20)
>>> getattr(a, 'b', b.x)(b.y)
20
>>> 

此处,bx作为&#34;函数属性的对象&#34;接受y参数作为b对象的其他属性。

getattr(a, 'b', b.x)返回函数引用,在我的示例中它返回x,因此在我的示例getattr(a, 'b', b.x)(b.y)中等同于b.x(b.y)

这里是另一个内置对象列表示例:

>>> L = [1, 2, 3, 4]
>>> getattr(a, 'b', L.append)(L[0])
>>> L
[1, 2, 3, 4, 1]
>>> 

因为a是简单的int,例如a = 10'b'不是a的属性,因此L.append函数返回getattr,而L[0]调用L.append附在清单L.

我认为以下示例将进一步帮助您:

>>> L.append
<built-in method append of list object at 0x7fd34e62c7a0>
>>> getattr(a, 'b', L.append)
<built-in method append of list object at 0x7fd34e62c7a0>
>>>