Python:单例模式魔法方法
__init__()和__new__():
__init__():初始化对象,给属性赋值
__new__():object基类提供的内置静态方法,在内存中为对象分配空间,返回对象的引用
重写__new__()一定要写return super(),__new__(cls),否则Python解释器得不到分配空间的对象引用,就不会调用__init__()
一个对象的实例化过程:首先执行__init__(),如果没有写__new__(),默认调用object里面的__new__(),返回一个实例对象,然后再去调用__init__(),给对象进行初始化
class Person(object): def __init__(cls,*args,**kwargs): print("new") return super() def __init__(self,name): self.name=name print("name:",self.name) pe=Person('lihailu')
单例模式:
可以理解成一个特殊的类,这个类只存在一个对象
弊端:多线程访问时容易引发线程安全问题
class A(object): pass a1=A() print(a1) a2=A() print(a2)
重写__new__()方法:
1.定义一个类属性,初始值为None,用来记录单例对象的引用
2.重写
3.进行判断,如果类属性是None,把__new__()返回的对象引用保存进去
4.返回类属性中记录的对象引用
class Singleton(object): obj=None def __new__(cls, *args, **kwargs): print("new") #判断类属性是否为空 if cls.obj==None: cls.obj=super().__new__(cls) return cls.obj def __init__(self): print("init") s=Singleton() print("s:",s) s2=Singleton() print("s2:",s2) #单例模式:每一次实例化所创建的对象都是同一个,内存地址都一样
运行结果为:
new
init
s: <__main__.Singleton object at 0x000002952B0B7E00>
new
init
s2: <__main__.Singleton object at 0x000002952B0B7E00>
通过导入模块实现单例模式:
应用场景:回收站对象,音乐播放器,开发游戏软件(场景管理器),数据库配置,数据库连接池的设计
魔法方法:
8.可调用对象:函数/内置函数和类都是可调用对象,凡是可以把一对()应用到某个对象身上都可以称之为可调用对象
callable():判断一个对象是否为可调用对象;