我是学习Python的Common Lisp程序员。我希望能够从各个部分构造一个函数。例如,如果我有一个带有属性的类,那么我可以使用点表示法来访问类实例的属性值,但是显然我不能构建一个函数来做同样的事情。对于下面的代码,我可以要求a.attr1,但是bar(a,attr1)不起作用。

class foo (object):
    def __init__(self, x, y):
        self.attr1 = x
        self.attr2 = y

a = foo(17,23)

print a.attr1

def bar (obj, fun):
    print obj.fun

bar(a, attr1)


NameError:名称“ attr1”未定义

毫无疑问,我不是以“ pythonic”的方式思考,但是稍微复杂一点的示例说明了为什么要这样做。假设我想返回按属性排序的字典中的值:

d = {}
d['a'] = foo(17,23)
d['b'] = foo(13,19)

for v in sorted(d.values(), key = lambda x: x.attr1): print v.attr1


这可以正常工作,但以下功能不能:

def baz (dict,attr):
    for v in sorted(dict.values(), key = lambda x: x.attr): print v.attr1

baz(d,attr1)


NameError:名称“ attr1”未定义

在Common Lisp中,我将引用的attr1传递进来,但是Python中似乎没有类似的功能。有什么建议么?谢谢!

最佳答案

def bar(obj, fun):
    print(getattr(obj, fun))

bar(a, 'attr1')


问题在于,由于非常好的原因,python无法识别attr1-没有这样的符号。

类似地:

def baz(d, attr):
    for v in sorted(d.values(), key = lambda x: getattr(x, attr)):
        print(v.attr1)

>>> d = { 'a':foo(17,23), 'b':foo(13,19) }
>>> baz(d, 'attr1')
13
17


在大多数情况下,如果您正在执行此类操作,则实际需要的是一个简单的字典。

关于python - 根据类属性组成函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16780168/

10-12 20:58