Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基类子类场景中的单例模式_Python_Python 2.7_Oop_Design Patterns_Singleton - Fatal编程技术网

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代码注释-已修复。除此之外,你能解释一下为什么你认为这不是一个好答案吗?