【发布时间】:2016-01-26 15:12:45
【问题描述】:
我有一个抽象类,我想为从我的抽象类继承的所有类实现单例模式。我知道我的代码不会工作,因为会有元类属性冲突。任何想法如何解决这个问题?
from abc import ABCMeta, abstractmethod, abstractproperty
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 GenericLogger(object):
__metaclass__ = ABCMeta
@abstractproperty
def SearchLink(self): pass
class Logger(GenericLogger):
__metaclass__ = Singleton
@property
def SearchLink(self): return ''
a = Logger()
【问题讨论】:
-
单例背后的原理是什么?
-
我将创建不同网站的解析器,每个解析器必须实现相同的方法,所以我想要一个抽象的基础。此外,每个网站我只需要 1 个解析器,不需要不同的解析器,因为解析器永远不会存储任何数据。它只处理内容。
-
如果没有状态,为什么不只是一个具有功能的模块。或者使用一个类,但只做一个。如果有两个实例,这不是灾难性的,为什么需要强制执行?
-
好吧,也许我并不完全诚实。我忘了添加解析器存储了一些特定于站点的信息,这些信息需要很长时间才能废弃,所以我认为强制程序员只能启动一次是有意义的。另外我想学习如何准确地实现单例
-
强迫程序员不是一个好主意,除非有真正的好处,或者没有其他安全的方法。只要有一个函数来创建一个解析器和一个存储解析器的映射
标签: python singleton abstract-class metaclass abc