Python中是否有静态构造函数或静态初始化程序?

010*_*101 32 python

Python中是否存在静态构造函数?

如何在Python中实现静态构造函数?

这是我的代码... __init__当我像这样调用App时不会触发.该__init__不是静态构造函数或静态初始化.

App.EmailQueue.DoSomething()
Run Code Online (Sandbox Code Playgroud)

我必须像这样调用它,每次都实例化App类:

App().EmailQueue.DoSomething()
Run Code Online (Sandbox Code Playgroud)

这是我的班级:

class App:
    def __init__(self):
        self._mailQueue = EmailQueue()

    @property
    def EmailQueue(self):
        return self._mailQueue
Run Code Online (Sandbox Code Playgroud)

__init__每次调用的问题是App对象被重新创建.我的"真正的"App类很长.

Sam*_*der 22

静态和动态语言之间存在根本区别,一开始并不总是很明显.

在静态语言中,类是在编译时定义的,并且在程序运行之前一切都很好并且具体设置.

在动态语言中,类实际上是在运行时定义的.一旦解释器解析并开始执行所有这些类和def语句,就会运行等效的静态构造函数.此时正在执行类定义.

您可以在类体内的任何位置放置任意数量的语句,它们实际上是一个静态构造函数.如果需要,可以将它们全部放在不self作为参数的函数中,并在类的末尾调用该函数.

  • 你真的试过`把它们放在一个不带自我的函数中,并在类的末尾调用那个函数`?这并不像听起来那么直截了当,因为当该函数运行时尚未创建类. (3认同)

Chr*_*rle 18

提示:引用的任何内容都self需要对类进行实例化.你可以这样做:

class App:
    email_queue = EmailQueue()

App.email_queue.DoSomething()
Run Code Online (Sandbox Code Playgroud)

但是来吧,这似乎有很多毛病.我喜欢SLaks,只是在课外初始化它.或者,您可以查看单例模式.

  • 这不应该是公认的答案。它没有解释如何创建静态初始化程序,而是建议创建对象。 (3认同)

Iwa*_*amp 14

我创建了一个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
Run Code Online (Sandbox Code Playgroud)

  • 很高兴看到明确解决问题的答案。也不错的解决方案。 (3认同)