完整定义一个构造函数class方法class

Define a constructor in full classmethod class

假设我有以下 class :

class Context:

    element_list = []

    @classmethod
    def add(cls, element):
        cls.element_list.append(element)

    @classmethod
    def remove(cls, element):
        cls.element_list.remove(cls.element_list.index(element))

这个 class 接近一个单身人士 class。 objective 是在我的程序中的任何地方更新 element_list 属性,而不传递 Context 实例作为我的函数的参数。

PyCharm 告诉我应该定义一个 __init__ 方法。但我不想创建此 class 的两个不同实例。我正在考虑创建一个像这样的虚拟 __init__ 方法:

def __init__(self):
    raise NotImplementedError("This class should not be initialized")

问题是(是):我应该定义一个 __init__ 方法吗?如果是怎么办?我应该使用单例 class 而不是使用 classmethod 实现(参见:Is there a simple, elegant way to define singletons?

  1. __init__方法不是必须的。如果你想将状态传递给正在初始化的实例,你应该只定义一个 __init__ 方法。查看您提供的代码片段,似乎并非如此。

  2. 在 python 中有几种实现单例模式的方法(技巧):

    • 查看 borg pattern
    • Creating a Singleton in Python
    • 上查看此 Stack Overflow 线程

    但是,我认为这些方法不是 pythonic,在大多数情况下应该避免使用。

    正如其他人所说,您始终可以使用python 模块。 Python 模块是 Python 编程语言最棒的功能之一。它们可以有 state(变量),behaviors(函数)并且在一个 Python 进程执行中,a 模块只会加载一次.

    这意味着,在如下目录结构中:

    .
    ├── bar.py
    ├── foo.py
    ├── main.py
    └── singleton.py
    

    你可以这样做:

    # file: singleton.py
    element_list = []
    

    您可以从应用程序的其余部分简单地导入并使用它:

    # file: foo.py
    import singleton
    
    def foo():
        # ... do complex computations ...
        singleton.element_list.append('baz')
    

    # file: bar.py
    import singleton
    
    def bar():
        # ... do more complex things ...
        if 'baz' in singleton.element_list:
            print('baz')
    

    # file: main.py
    import foo
    import bar
    
    foo.foo()
    bar.bar()
    # OUTPUTS: 'baz'
    

    正如您所看到的,除了简单和优雅之外,使用该模块还为您提供了所有常用的列表实用程序来与之交互(例如,您可以执行 singleton.element_list[1:]singleton.element_list + ['my', 'other', 'list'],以及很快)。如果您想按照自己的方式执行此操作,则必须实现其他类方法。