如何在像 Java/Spring 那样调用 class 方法之前设置对象?

How to setup an object before calling class methods like in Java/Spring?

我有一个对象需要通过读取配置文件和环境变量来初始化。它有 class 方法,我想确保在执行 class 方法之前初始化对象。

有没有办法初始化所有这种性质的classes?我的代码中可能会有很多这样的东西。 我来自 Java/Spring 背景,只需将 @Service 放在 class 或 @PostConstruct 之上的初始化方法上即可确保它被调用。如果在正常 Python 中没有一种干净的方法可以做到这一点,是否有框架可以使这更容易?

所以 class 看起来像这样

class MyClass(object):
    def setup(self):
        # read variables from the environment and config files

    @classmethod
    def my_method(cls, params):
        # run some code based on params and variables initialised during setup

是。

class MyClass(object):
    def __init__(self): #instead of setup()
        # read variables from the environment and config files

    @classmethod
    def my_method(cls, params):
        # run some code based on params and variables initialised during setup
MyClass._instance=MyClass()

基本上,当您第一次 import/加载包含 MyClass 的文件时,它将 运行 __init__ 构造函数 一次 因为它是内部的 _instance。然后可以从所有其他 class 方法访问该实例(单例)。

选项#2。

class MyClass(object):
    # No setup()
    setting_A="foo"
    setting_B="bar"
    dict_of_settings={"foo":"bar"}
    # basically you can define some class variables here

    @classmethod
    def my_method(cls, params):
        print cls.setting_B # etc

此选项完全避免使用任何 global 代码。然而,它的代价是您的 settings 不再很好地封装在 instance.

您始终可以使用简单的单例实现,这听起来就像您正在尝试做的那样。这个 post 有如何做的例子和一些关于你是否真的需要单例的想法。 Is there a simple, elegant way to define singletons?