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作为参数的函数中,并在类的末尾调用该函数.
Chr*_*rle 18
提示:引用的任何内容都self需要对类进行实例化.你可以这样做:
class App:
email_queue = EmailQueue()
App.email_queue.DoSomething()
Run Code Online (Sandbox Code Playgroud)
但是来吧,这似乎有很多毛病.我喜欢SLaks,只是在课外初始化它.或者,您可以查看单例模式.
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)