【发布时间】:2018-08-31 09:00:56
【问题描述】:
这可能是一个愚蠢的问题,因为我刚刚了解了元类......
如果您在自己的文件中有 2 个 Singleton 类,那么在两个文件中复制 Singleton 元类定义是不好的做法,例如
Apple.py
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Apple(metaclass=Singleton):
pass
print(Apple() == Apple()) # True
Orange.py
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Orange(metaclass=Singleton):
pass
print(Orange() == Orange()) # True
或者我们应该将 Singleton 元类代码移动到它自己的文件Singleton.py 中,然后将它们导入到Apple.py 和Orange.py 中?
或者使用 singleton-decorator 包中的 @singleton 装饰器?
【问题讨论】:
-
is it poor practice to duplicate the Singleton metaclass definition in both files, like是的。重复自己从来都不是一件好事。 -
@sytech 谢谢,我还没有遇到从另一个文件导入元类定义的代码。
-
@Nyxynyx 这正是标准库中的
abc模块所做的。元类在某些方面很神奇,但不是在这方面。 -
@chepner 我在这里有点困惑。您是否建议让
Singleton类成为ABCMeta的子类而不是type?我不熟悉abc模块,希望能得到解释 -
为什么不会你把
Singleton放在它自己的模块中?不要复制和粘贴代码。那是错的。
标签: python python-3.x singleton metaclass