完整定义一个构造函数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?)
__init__
方法不是必须的。如果你想将状态传递给正在初始化的实例,你应该只定义一个 __init__
方法。查看您提供的代码片段,似乎并非如此。
在 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']
,以及很快)。如果您想按照自己的方式执行此操作,则必须实现其他类方法。
假设我有以下 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?)
__init__
方法不是必须的。如果你想将状态传递给正在初始化的实例,你应该只定义一个__init__
方法。查看您提供的代码片段,似乎并非如此。在 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']
,以及很快)。如果您想按照自己的方式执行此操作,则必须实现其他类方法。