在python中,在类声明范围内引用类方法的任何优雅方式?

时间:2010-10-14 02:14:56

标签: python

下面的代码在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}}

4 个答案:

答案 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__可以访问基础函数。