【发布时间】:2022-01-22 06:14:20
【问题描述】:
class StaticClass(object):
words = []
StaticClass.init()
@staticmethod
def init(file_name):
...
words.append('word')
...
@staticmethod
def fun():
print('fun')
test = StaticClass()
错误信息是:
StaticClass.init()
NameError: name 'StaticClass' is not defined
为什么不能在类中调用静态函数?
我想使用一个类来做到这一点,也希望用户能够做到:
StaticClass.fun()
如何实现效果?
【问题讨论】:
-
你不能像那样在类的主体中使用类的名称。如果必须使用函数将
words初始化为类属性,只需在类外定义函数即可。如果您只是想捆绑一些功能,请考虑编写模块而不是类。 -
这个错误的问题是StaticClass 没有在范围内定义,直到它的主体中的所有语句都被执行。也就是说,Python 中的类定义是执行的,而不是像 C# 或 Java 这样的“定义”。
-
@MisterMiyagi,那么我应该将它定义为实例函数吗?我希望用户可以直接使用 StaticClass.fun(),而无需先显式实例化它。
-
只是为了确定:你的类实际上有任何实例状态吗?如果没有,通常最好使用模块。
-
如果
StaticClass.init必须在用户可以使用StaticClass.fun之前发生,那么您自己在顶层调用它,紧跟在class定义之后。如果用户以后也不应该再次调用它,请考虑使用前导下划线对其进行标记。但是,如果您需要来自用户的信息(例如file_name),那么您就不走运了。是的,一般而言仔细考虑为什么要使事物静态化。类作为命名空间有点笨拙。
标签: python