Python中有没有静态构造函数或静态初始化器?
在Python中有没有静态构造函数的概念?
我该如何在Python中实现一个静态构造函数呢?
这是我的代码……当我这样调用App时,__init__
并没有被触发。__init__
并不是一个静态构造函数或静态初始化器。
App.EmailQueue.DoSomething()
我必须这样调用它,这样每次都会实例化App类:
App().EmailQueue.DoSomething()
这是我的类:
class App:
def __init__(self):
self._mailQueue = EmailQueue()
@property
def EmailQueue(self):
return self._mailQueue
每次调用__init__
的问题在于App对象会被重新创建。我的“真实”App类相当长。
6 个回答
29
我创建了一个叫做 static_init
的装饰器,它会在类中如果存在 static_init
这个类方法时调用它。
下面是这个装饰器的代码,以及一个示例,展示了如何用它来初始化一个枚举类中的类变量:
# pylint: disable=missing-docstring,no-member
import enum
def static_init(cls):
if getattr(cls, "static_init", None):
cls.static_init()
return cls
@static_init
class SomeEnum(enum.Enum):
VAL_A = enum.auto()
VAL_B = enum.auto()
VAL_C = enum.auto()
VAL_D = enum.auto()
@classmethod
def static_init(cls):
text_dict = {}
setattr(cls, 'text_dict', text_dict)
for value in cls:
text_dict[value.name.lower().replace("_", " ").title()] = value
def test_static_init():
assert SomeEnum.text_dict["Val A"] == SomeEnum.VAL_A
assert SomeEnum.text_dict["Val B"] == SomeEnum.VAL_B
assert SomeEnum.text_dict["Val C"] == SomeEnum.VAL_C
assert SomeEnum.text_dict["Val D"] == SomeEnum.VAL_D
31
静态语言和动态语言之间有一个根本的区别,这个区别一开始可能不太明显。
在静态语言中,类是在编译时就定义好的,所有的东西在程序运行之前就已经确定好了,像是把一切都固定在了水泥里。
而在动态语言中,类是在程序运行时才定义的。当解释器开始解析和执行这些类和函数定义时,就相当于在运行一个静态构造函数。这个时候,类的定义正在被执行。
你可以在类的主体内随便放置任何语句,这些语句实际上就像是一个静态构造函数。如果你愿意,可以把它们放在一个不需要 self
参数的函数里,然后在类的末尾调用这个函数。
23
提示:任何提到 self
的地方,都需要先创建这个类的实例。你可以这样做:
class App:
email_queue = EmailQueue()
App.email_queue.do_something()
不过,老实说,这样做感觉有点繁琐。我同意SLaks的看法,直接在类外面初始化就好。或者,你也可以了解一下单例模式。