下面的代碼可以在Python 2.6和3.1下運行,但SomeObject.columns
的第三個lambda有點愚蠢,沒有真正的目的,但是爲了防止在類聲明結束之前查看對SomeObject.helper_function
的引用。這似乎是一個黑客。如果我刪除了lambda,並用SomeObject.helper_function
替換它,我會得到NameError: name 'SomeObject' is not defined
。我錯過了一個更好的非哈克方式嗎?在Python中,任何優雅的方式來引用類聲明範圍內的類方法?
class SomeObject:
def __init__(self, values):
self.values = values
@staticmethod
def helper_function(row):
# do something fancy here
return str(len(row))
columns = [
(lambda x: x['type'], 'Type'),
(lambda x: 'http://localhost/view?id=%s' % x['id'], 'Link'),
(lambda x: SomeObject.helper_function(x), 'Data'),
]
def render_table_head(self):
print('\t'.join([c[1] for c in self.columns]))
def render_table_body(self):
for row in self.values:
print('\t'.join([col[0](row) for col in self.columns]))
FWIW,我從來沒有遇到問題,指的是由名稱定義的函數。該代碼實際上並沒有運行,直到名稱被定義。我錯過了什麼嗎? – aaronasterling 2010-10-14 03:06:56
@Aaron:這不會給你這個函數本身,它會給你任何綁定這個名字的東西;例如,如果函數是裝飾的,或者包含的範圍因爲某些其他原因而更改,則這是不同的。 *一般*這就是你想要的,但我認爲你應該能夠在一般情況下獲得對「這個對象」的引用,而不必按名稱查找自己。 – 2010-10-14 03:15:42
是的,我注意到之前缺少這些關鍵字,但是我認爲我對它們的渴望是C/C++污染心靈的產物,並設法找到完美的優雅替代品。這是第一次看起來沒有。 – 2010-10-14 03:29:22