我是一名学习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”的方式思考,而是一个稍微复杂的例子说明我为什么要这样做。假设我想返回按属性排序的dict中的值:
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中似乎没有类似的功能。有什么建议?谢谢!
答案 0 :(得分:2)
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
大多数时候,如果你正在做这些事情,你真正需要的是一个简单的字典。