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

猜你喜欢

转载自www.cnblogs.com/orcsir/p/9213096.html