0x01:newinit方法

  1. class A(object):
  2. def __init__(self):
  3. print("这是 init 方法")
  4. def __new__(cls):
  5. print("这是 new 方法")
  6. return object.__new__(cls) 申请内存创建对象,并把对象的类型设置为cls
  7. A()

总结

  • new至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

  • new必须要有返回值,返回实例化出来的实例,这点在自己实现new时要特别注意,可以return父类new出来的实例,或者直接是object的new出来的实例

  • init有一个参数self,就是这个new返回的实例,initnew的基础上可以完成一些其它初始化的动作,init不需要返回值

0x02:单例设计模式

举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

  1. class Singleton:
  2. __instance = None # 类属性
  3. __is_first = True
  4. @classmethod
  5. def __new__(cls, *args, **kwargs):
  6. if cls.__instance is None:
  7. # 申请内存,创建一个对象,并把对象的类型设置为cls
  8. cls.__instance = object.__new__(cls)
  9. return cls.__instance
  10. def __init__(self, a, b):
  11. if self.__is_first:
  12. self.a = a
  13. self.b = b
  14. self.__is_first = False
  15. # 调用 __new__ 方法申请内存
  16. # 如果不重写 __new__ 方法,会调用 object 的 __new__ 方法
  17. # object的 __new__ 方法会申请内存
  18. # 如果重写了 __new__ 方法,需要自己手动的申请内存
  19. s1 = Singleton('呵呵', '嘿嘿嘿')
  20. s2 = Singleton('哈哈', '嘻嘻嘻')
  21. s3 = Singleton('嘎嘎', '嘤嘤嘤')
  22. print(s1 is s2) # True
  23. print(s1.a, s1.b)