Python 基类子类场景中的单例模式
我的印象是,使用单例模式可以将类的实例化次数限制为一个对象。记住这一点,请查看以下代码:Python 基类子类场景中的单例模式,python,python-2.7,oop,design-patterns,singleton,Python,Python 2.7,Oop,Design Patterns,Singleton,我的印象是,使用单例模式可以将类的实例化次数限制为一个对象。记住这一点,请查看以下代码: class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
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 base1(object):
__metaclass__ = Singleton
class base2(base1):
pass
class base3(base1):
pass
class base4(base2):
pass
obj1 = base4()
obj2 = base4()
print obj1 is obj2 #prints True
obj3 = base3()
obj4 = base3()
print obj3 is obj4 #prints True
print obj1 is obj3 #prints False
第一个print语句打印True
,这证明obj3
和obj4
是同一个对象。但是第二个print语句打印的False
证明obj1
和obj3
是不同的。实现目标的最佳方法是什么,“始终返回相同的base1对象,无论哪个子类实例化它”
代码是从中复制的
您可以创建一个终端
类,并将其用作\uuuuu元类
,以便其他类不能从中继承:
class terminal(type):
def __init__(self, cl_name, bases, namespace):
for cls in bases:
if isinstance(cls, terminal):
raise TypeError("in "+cl_name+" definition : "+str(cls)+
" can't be used as a base class")
super(terminal, self).__init__(cl_name, bases, namespace)
# first we create a normal class
class a(object):
pass
#the terminal class: it can inherit from other classes but can't be
#used as base class
class b(a):
__metaclass__= terminal
#this will fail because inheriting from b is forbidden
class c(b):
pass
为什么会有这些子类?见鬼,如果你真的想通过基于元类的强制方式来实现单例,那你为什么还要允许这些子类存在呢?这是没有意义的!如果所有类都只能创建其基础的对象,为什么还要创建多个类呢?您是否需要基类的别名?您的代码专门构建为允许层次结构中的每个类使用一个单例。你为什么一开始就这样编程?那“编译”时间到底是什么时候?类创建发生在运行时@Wombatz代码注释-已修复。除此之外,你能解释一下为什么你认为这不是一个好答案吗?