Python中有没有静态构造函数或静态初始化器?

53 投票
6 回答
57717 浏览
提问于 2025-04-17 02:10

在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的看法,直接在类外面初始化就好。或者,你也可以了解一下单例模式

撰写回答