在Python类定义中调用静态方法

时间:2013-01-07 16:49:07

标签: python

我有一个定义静态方法的类定义。我有一个字段,我想用静态方法初始化。我的默认思维让我想到了这个:

class SomeConcreteClass(object):
    some_data = SomeConcreteClass.create_default_data()
    @staticmethod
    def create_default_data():
        return 'Foo'

问题是当我运行时,我得到一个NameError: name 'SomeConcreteClass' is not defined。这是有道理的,因为SomeConcreteClass正在构建。这是否意味着我不能使用静态init函数?是否有其他方法建议处理这种情况?

3 个答案:

答案 0 :(得分:2)

create_default_data的适当位置将完全在课外。然后你的问题就消失了:

def create_default_data():
    return 'Foo'

class SomeConcreteClass(object):
    some_data = create_default_data()

如果你真的希望它作为一个静态方法在类中也是如此:

def _create_default_data():
    return 'Foo'

class SomeConcreteClass(object):
    some_data = _create_default_data()
    create_default_data = staticmethod(_create_default_data)

但是Python中并不经常使用静态方法,因为除非它以某种方式在类上运行,否则不需要在类中放置函数。

答案 1 :(得分:1)

我认为你不想这样做。不要忘记Python不是Java™...在类级别定义的属性是类属性,而不是实例属性。您几乎肯定希望数据特定于实例,因此您应该使用__init__方法执行此操作。如果你愿意的话,你当然可以在该方法中调用classmethod,或者(更好)将代码放在__init__中。

答案 2 :(得分:1)

如果some_data正好是create_default_data的输出(假设后者在您的通话中是确定性的)那么为什么不只要some_data成为@property

class SomeConcreteClass(object):
    @property
    def some_data():
        return 'Foo'

或者,但不等效,您可以为some_data中的每个实例初始化__init__