2013-01-07 21 views
1

我有定义静态方法的类定义。我有一个我想用静态方法初始化的字段。我默认思维使我这个:调用Python类定义中的静态方法

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

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

+0

这个类是否有任何属于某个实例的数据? –

+3

不在范围内的类名甚至不是全部问题;你也试图调用尚未定义的方法。 – geoffspear

+0

@Wooble:确实如此,但如果您最后发出呼叫,问题仍然存在。 –

回答

1

如果some_data也正是create_default_data输出(假设后者是确定在呼叫的情况下),那么,为什么不只是做一个some_data@property

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

或者,但不等价,你可以为每个实例中__init__初始化some_data

+0

或者让'some_data'属性 - 我沿着这条路线走了。 –

+1

@TheodrosZelleke嗯,是的,但名称为'some_data'。 :) – ezod

1

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

+0

在这种情况下,数据实际上不是实例特定的。它真的是班级定义的一部分。我简化了我的示例,但实际上,我的'SomeConcreteClass'扩展了另一个具有'__init__'的类,它接受params。我宁愿不必在扩展父代的所有类中实现传递“__init__”。目前,我正在通过将some_data设置为属性来解决问题,但在纯粹级别上,我觉得它不太理想,因为数据不是特定于实例的。 –

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中,因为没有需要在类中放置一个函数,除非它以某种方式在类上运行。