如何使用Python将字符串转换为类子属性

MFB*_*MFB 5 python attributes class

我知道我可以使用这样的字符串获取Class的属性:

object.attribute = 'foo'
x = 'attribute'
getattr(object, x)
>>> 'foo'
Run Code Online (Sandbox Code Playgroud)

有没有办法用字符串"深入"对象的属性?换句话说,如果我的对象包含另一个对象,我如何用字符串获取子对象的属性?例如:

object.object.attribute
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 9

operator.attrgetter功能执行此操作:

class Foo: pass
f = Foo()
f.bar = Foo()
f.bar.baz = Foo()
f.bar.baz.quux = "Found me!"

import operator
print operator.attrgetter("bar.baz.quux")(f)     # prints "Found me!"
Run Code Online (Sandbox Code Playgroud)


jdi*_*jdi 6

我喜欢这个链接中给出的配方(实际上评论甚至更好)

借用Claudiu的回答(也很棒):

class Foo: pass
f = Foo()
f.bar = Foo()
f.bar.baz = Foo()
f.bar.baz.quux = "Found me!"
Run Code Online (Sandbox Code Playgroud)

跟随点的递归getattr:

>>> rgetattr = lambda o,a: reduce(getattr, a.split('.'), o)
>>> rgetattr(f, 'bar.baz.quux')
'Found me!'
Run Code Online (Sandbox Code Playgroud)

非lambda版本是:

def rgetattr(obj, attr):
    return reduce(getattr, attr.split('.'), obj)
Run Code Online (Sandbox Code Playgroud)