下面的代码在Python 2.6和3.1下都有效,但SomeObject.columns
的第三个lambda有点傻,没有任何实际意义,但是为了防止在SomeObject.helper_function
之前查看SomeObject.helper_function
的引用类声明完成。这似乎是一个黑客。如果我删除了lambda,并将其替换为NameError: name 'SomeObject' is not defined
,则会得到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]))
。我错过了一种更好的非黑客方式吗?
{{1}}
答案 0 :(得分:4)
无法引用当前正在定义的类。确实应该有关于当前范围的关键字,例如。 __this_class__
用于定义最内层类,__this_func__
用于最内层函数,因此类和函数可以干净地引用自己而不必重复其名称。
您可以将列的定义移出类主体:
class SomeObject:
def __init__(self, values):
self.values = values
...
SomeObject.columns = [
(lambda x: x['type'], 'Type'),
(lambda x: 'http://localhost/view?id=%s' % x['id'], 'Link'),
(SomeObject.helper_function, 'Data'),
]
顺便说一下,请始终使用至少4个空格的缩进。更少的东西很难阅读。
答案 1 :(得分:0)
为什么不在 init ()中填充列并使用self?
def __init__(self, values):
self.values = values
self.columns = [
(lambda x: x['type'], 'Type'),
(lambda x: 'http://localhost/view?id=%s' % x['id'], 'Link'),
(self.helper_function, 'Data'),
]
答案 2 :(得分:0)
这很有效。这违背了我的所有感受。
class SomeObject:
def __init__(self, values):
self.values = values
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'),
(helper_function, '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]))
if __name__ == '__main__':
print "foo"
o = SomeObject([{'type':'type100', 'id':'myId'}, {'type':'type200', 'id':'myId2'}])
o.render_table_body()
答案 3 :(得分:0)
您可以通过
直接参考静态功能(helper_function.__func__, 'Data'),
无需更改代码中的任何其他内容。 helper_function
的类型为staticmethod
,__func__
可以访问基础函数。