Python编程之基础知识练习_008
练习内容:使用元类创建单例模式
预备知识:
1.Python中一切皆对象,类也是对象
2.类的实例可调用,则需要实例所属的类实现__call__方法,同理,类对象可调用,则需要定义类对象的类实现__call__方法。
3.Python提供metaclass实现类的定制
1 __author__ = 'Orcsir' 2 3 4 class Singleton(type): 5 def __init__(self, self_name, self_bases, self_dict): 6 """ 7 self:类对象 8 self_name:类对象名字 9 self_bases:类对象基类们 10 self_dict:类对象的字典 11 """ 12 self.__instance = None 13 super().__init__(self_name, self_bases, self_dict) 14 15 # 类对象是可调用的,所以要在此类中定义__call__方法 16 def __call__(self, *args, **kwargs): 17 """ 18 args,kwargs:收纳所有可能的传参方式 19 20 """ 21 if self.__instance is None: 22 self.__instance = super().__call__(*args, **kwargs) # 产生一个唯一的实例 23 return self.__instance 24 25 26 class Spam(metaclass=Singleton): 27 def __init__(self, x, y): 28 print("__init__ is called") # 只会调用一次 29 self.x = x 30 self.y = y 31 32 if __name__ == '__main__': 33 s1 = Spam(1, 2) 34 s2 = Spam(3, 4) # 没有新的实例产生。只是做了 s2=s1 35 print(id(s1), id(s2)) 36 print(id(s1) == id(s2)) # True