new单例模式:
new:创建实例对象 — 其返回的就是类的实例化对象
# 在开发及面试中,经常会接触一点,就是单例模式。
# 这是为了实现实例之间的数据互通,同时也是是解决多继承问题
# 在python中需要__new__方法来实现
# 1.__new__方法在类创建实例的时候自动调用
# 2.实例是通过类里面的__new__方法来创建实例,再调用__init__方法初始化实例
# 3.cls代表类本身
class Base():
def __init__(self):
print('__init__被调用')
def __new__(cls):
"""
cls是指类本身
"""
print(f'cls是:{cls}')
print('__new__被调用')
return object.__new__(cls)
test1 = Base()
# cls是:<class '__main__.Base'>
# __new__被调用
# __init__被调用
class Base():
def __init__(self):
self.name = 'earth'
def __new__(cls):
"""
super() 函数是用于调用父类(超类)的一个方法。
hasattr(寻找对象,属性名):查找属性
instance: 属性名称,用于修改实例化对象
super().__new__(cls) : 调用父类的new方法,同时也是创建新的实例:
在第一次一旦进入创建出来之后,那么下次新的实例出来时,不会再次进入new
因为已经实例,存在instance
"""
# 判断类本身是否存在instance属性
if not hasattr(cls, 'instance'):
print(super()) # <super: <class 'Base'>, <Base object>>
# 没有就添加
cls.instance = super().__new__(cls) # super().__new__(cls)创建实例,赋值给cls.instance
# 后面实例化后用的是同一个实例
return cls.instance # 返回实例化的对象
a = Base()
b = Base()
print(a, id(a))
print(b, id(b))
扩展
# __class__: 查看类名
# __dict__: 查看全部属性,返回属性值(键值对形式)
# __doc__: 查看对象文档,即类中三引号部分,
# __bases__: 查看父类
# __mro__: 查看多继承情况下,子类调用父类搜索顺序
调用方法:
实例.__class__
实例.__dict__
类名.__base__
类名.__doc__
子类名.__mro__
(实例.__class__.__mro__)