簡體   English   中英

根據類屬性組成函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM