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

在Python类定义内调用静态方法,python,Python,我有一个定义静态方法的类定义。我有一个字段,我想用静态方法初始化它。我的默认思维导致我这样做: class SomeConcreteClass(object): some_data = SomeConcreteClass.create_default_data() @staticmethod def create_default_data(): return 'Foo' 问题是,当我运行这个时,我得到一个NameError:name'SomeConcre

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

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

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

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

我认为您不想这样做。不要忘记Python不是Java™... 在类级别定义的属性是类属性,而不是实例属性。您几乎肯定希望数据是特定于实例的,因此您应该在
\uuuu init\uuu
方法中执行此操作。如果愿意,您当然可以从该方法中调用classmethod,或者(更好)只要将代码放入
\uuuu init\uuuu
中,如果
某些数据
正是
创建默认数据
的输出(并且假设后者在您的调用上下文中是确定性的)那为什么不干脆把一些数据变成一个属性呢

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

或者,如果
某些数据
恰好是
创建默认数据
的输出,则可以为
中的每个实例初始化
某些数据
(并假设后者在调用上下文中是确定的)那为什么不干脆把一些数据变成一个属性呢

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

或者,您可以为
中的每个实例初始化
一些\u数据

创建默认\u数据
的适当位置将完全在类之外。然后你的问题就消失了:

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

创建默认数据的合适位置将完全在类之外。然后你的问题就消失了:

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

该类是否有属于实例的数据?类名不在范围内甚至不是全部问题;您还试图调用一个尚未定义的方法。@Wooble:True,但如果您在最后调用,问题仍然存在。我知道SomeConcreteClass没有定义。该函数可以放在它第一次使用的位置之前,但它不能解决这个问题。我现在的想法是将一些_数据设置为
@属性
,而不是在class def时初始化的字段。真的,我在这里查看样式指南。在类def之后添加(立即)怎么样:
SomeConcreteClass.some\u data=SomeConcreteClass.create\u default\u data()
?这个类是否有属于实例的数据?类名不在范围内甚至不是全部问题;您还试图调用一个尚未定义的方法。@Wooble:True,但如果您在最后调用,问题仍然存在。我知道SomeConcreteClass没有定义。该函数可以放在它第一次使用的位置之前,但它不能解决这个问题。我现在的想法是将一些_数据设置为
@属性
,而不是在class def时初始化的字段。实际上,我在这里查看样式指南。在类def之后添加(立即)怎么样:
SomeConcreteClass.some\u data=SomeConcreteClass.create\u default\u data()
?在这种情况下,数据实际上不是特定于实例的。这确实是类定义的一部分。我稍微简化了我的示例,但实际上我的
SomeConcreteClass
扩展了另一个类,该类有一个接受参数的
\uuuu init\uuuu
。我希望不必在扩展父类的所有类中实现直通
\uuuu init\uuuu
。目前,我正在通过将一些_数据作为属性来解决这个问题,但在纯粹主义的层面上,我觉得它有点不理想,因为数据不是特定于实例的。在这种情况下,数据实际上不是特定于实例的。这确实是类定义的一部分。我稍微简化了我的示例,但实际上我的
SomeConcreteClass
扩展了另一个类,该类有一个接受参数的
\uuuu init\uuuu
。我希望不必在扩展父类的所有类中实现直通
\uuuu init\uuuu
。目前,我正在通过将一些_数据作为属性来解决这个问题,但在纯粹主义的层面上,我觉得它有点不理想,因为数据不是特定于实例的。或者jsut将一些_数据
作为属性——我走了这条路。@TheodrosZelleke是的,但名称是
一些_数据
)或者jsut将
some_data
作为属性——我走了这条路。@TheodrosZelleke是的,但名字是
some_data
:)