从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)
答案 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.y
为1
,已作为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
>>>
此处,b
是x
作为&#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>
>>>