自定义元类控制类的实例化行为的应用

#实现方式一
class Mysql:
__instance = None # __instance = s
def __int__(self):
self.post = 1.235
self.host = 3
@classmethod
def singleton(cls):
if not cls.__instance:
obj = cls()
cls.__instance = obj
return cls.__instance
def talk(self):
pass
def func(self):
pass
s = Mysql.singleton()
d = Mysql.singleton()
f = Mysql.singleton()
a = Mysql.singleton()
print(s is a)

'''
这是单例模式, 如果每个对象中的属性相同, 就可以用这种办法,每次用类去调用类的函数属性进行执行
首次执行会把__instance = obj 自此以后就会把这个类的变量属性返回给其他的对象,因此无论产生再多的对象他们都是使用的第一个对象
'''

#实现方式二
class Mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
super(Mymeta, self).__init__(class_name, class_bases, class_dic)
self.__instance = None
print(self)
def __call__(self, *args, **kwargs):
if not self.__instance:
obj = object.__new__(self)
self.__init__(obj)
self.__instance = obj
print(self)
return self.__instance

class Mysql(object, metaclass=Mymeta):
def __int__(self):
self.post = 1.235
self.host = 3
def talk(self):
pass
def func(self):
pass

s = Mysql()
d = Mysql()
f = Mysql()
print(s is f)
'''
元类也可以实现单例模式,同时还是需要遵循__call__里面的三原则:生产对象,初始化对象,返回对象
此时我们在Mysql的自定义元类的Mymeta里面为Mysql的对象self生成一个空属性__instance = None ,此时我们
定义的Mysql类如果实例化就会激活__call__ 随之我们在__casll__里面进行单例模式的实现, 判断__instance是否为空, 如果空我们就开始创建空对象,随之我们需要对空对象实例化,然后把空对形象赋值给__instance最后返回给其他外部要实例化的对象

'''


原文地址:https://www.cnblogs.com/yuexijun/p/10326285.html