[英]Composing functions from class attributes
我是學習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
在大多數情況下,如果您正在執行此類操作,則實際需要的是一個簡單的字典。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.