2014-04-22 28 views
1

从python官方文档中,我看到了getattr()的正常表达式;在getattr()中有两个参数意味着什么?

GETATTR(对象,名称[,默认])

我理解它相当好。例如,我可以这样做:

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

,但现在我看的代码,笔者使用类似的模式:

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

而且我甚至没有发现“B”'一个'物体!

这使我困惑不已,这段代码是什么意思?


附录1:

的GETATTR()是一个大量导入语句之间。 和原来的表达是这样的:

from tornado.options import define, options 
import settings  

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

他是快捷方式,属性是一个函数,他用'by'调用它作为参数。请给我们更多的代码。 – msvalkon

回答

2

b是一个对象,而不是一个常量。此代码的作者说:“让我的a的属性,其名称是由b.x是什么给,并称它传递任何b.y是”。

+0

我应该认为getattr(a,b.x)得到一个可调用的对象,并且他用b.y参数调用了这个对象吗? – Zen

+0

是的。 'b.y'不是getattr的参数,而是getattr检索的可调用对象。 –

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 

在上面的例子中,我们正在从所谓foo对象a的方法。请注意,b.x的值为"foo"b.y1,其作为val传递给a.foo()

+0

我知道得到b.x字符串在a中,但是b.y是默认值,或者b.y是传递给b.x的参数? – Zen

+0

如果省略第三个参数,'getattr'会产生一个异常,而不是返回一个默认值。 'b.y'是函数调用的参数。 – chepner

+0

@chepner,如何连线,getattr只允许字符串,但是当你把它当作一个可调用的对象时,他会允许你使用对象! – Zen

0

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

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

那么额外的(b.y)是什么意思? – Zen

+0

@Zen'y'是作为函数参数传递的其他属性。 –

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一个对象作为接受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属性,因此通过getattr功能和L.append调用L[0]是1在列表附加L.

我想下面的例子将进一步帮助你返回L.append

>>> 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> 
>>> 
相关问题