我有一个定义静态方法的类定义。我有一个字段,我想用静态方法初始化。我的默认思维让我想到了这个:
class SomeConcreteClass(object):
some_data = SomeConcreteClass.create_default_data()
@staticmethod
def create_default_data():
return 'Foo'
问题是当我运行时,我得到一个NameError: name 'SomeConcreteClass' is not defined
。这是有道理的,因为SomeConcreteClass正在构建。这是否意味着我不能使用静态init函数?是否有其他方法建议处理这种情况?
答案 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__
。