metaclass = Singleton
这个例子中我们使用元类Singleton替代默认使用type方式创建类my_cls
。可以将类my_cls看做是元类Singleton的一个对象,当我们使用my_cls(...)
的方式创建类my_cls
的对象时,实际上是在调用元类Singleton的对象my_cls。
对象可以以函数的方式被调用,那么要求类中定义__call__
函数。不过此处被调用的是类,因此我们在元类中定义函数__call__
来控制类my_cls
对象创建的唯一性。
这种方式的弊端之一就是类唯一的对象被存放在类的一个静态数据成员中,外部可以通过class_name._instance
的方式修改甚至删除这个实例(该例中my_cls._instance = None
完全合法)。
4.类作为装饰器之__call__
方式
不仅函数可以作为装饰器,类也可以作为装饰器。
下面简单的介绍一下使用类作为装饰器实现单例模式的另一种方式。
‘’’
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
‘’’
class Singleton(object):
_INSTANCE = {}
def init(self, cls):
self.cls = cls
def call(self, *args, **kwargs):
instance = self._INSTANCE.get(self.cls, None)
if not instance:
instance = self.cls(*args, **kwargs)
self._INSTANCE[self.cls] = instance
return instance
def getattr(self, key):
return getattr(self.cls, key, None)
@Singleton
class my_cls(object):
pass
函数作为装饰器返回的是一个函数,函数被调用过程中实际上是间接地调用其内部包裹的被装饰的对象。