1

我有一个定义静态方法的类定义。我有一个我想用静态方法初始化的字段。我的默认想法导致我这样做:

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

问题是当我运行它时,我得到一个NameError: name 'SomeConcreteClass' is not defined. 这是有道理的,因为 SomeConcreteClass 刚刚被构建。这是否意味着我不能使用静态初始化函数?有没有推荐的替代方法来处理这种情况?

4

3 回答 3

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 中并不经常使用,因为不需要将函数放在类中,除非它以某种方式对类进行操作。

于 2013-01-07T17:23:58.573 回答
1

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

于 2013-01-07T16:58:35.103 回答
1

如果some_data恰好是create_default_data(并假设后者在您的调用上下文中是确定性的)的输出,那么为什么不只做some_data一个@property

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

或者,但不是等效的,您可以some_data__init__.

于 2013-01-07T16:59:54.463 回答