zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    构造方法
    $this
    public/private/protected三种访问控制符的区别
    vsftpd的虚拟主机配置,错误记录
    高斯模糊css
    css绘制三角形
    禁止缩放的一行代码
    自适应的Javascript代码resize.js
    判断是pc端还是手机端js
    倒计时
  • 原文地址:https://www.cnblogs.com/orcsir/p/9213096.html
Copyright © 2011-2022 走看看