设计模式:
为了使代码可重用,让代码更容易让人理解,保证代码可靠性。
单例模式:
让类创建的对象,在系统中只有唯一的一个示例,每一次执行类名()
返回的对象,内存地址是相同的。
__new__方法
- 使用
类名()
创建对象时,Python
的解释器首先会调用__new__
方法为对象分配空间 - __new__是一个有object基类提供的内置的静态方法,主要作用有两个:
- 1)在内存中为对象分配空间
- 2)返回对象的引用
- Python的解释器获得对象的引用后,将引用作为第一个参数,传递给
__init__
方法。
重写__new__方法的代码非常固定
- 重写__new__方法一定要
return super.__new__(cls)
- 否则Python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
- 注意:__new__是一个静态方法,在调用时需要主动传递参数
cls
代码示例
class MusicPlayer(object):
def __init__(self):
print("初始化播放器")
# 创建播放器对象
player = MusicPlayer()
print(player)
class MusicPlayer(object):
def __new__(cls, *args, **kwargs):
# 1.创建对象时,new方法会被自动调用
print("创建对象,分配空间")
def __init__(self):
print("初始化播放器")
# 创建播放器对象
player = MusicPlayer()
print(player)
__new__
方法被调用,print
输出了一个空对象,且__init__
方法没被调用
原因:我们重写了__new__
方法,但没有返回其分配的内存空间,此时Python
解释器得不到分配了内存空间的对象引用,所以输出了一个None
,得不到分配了内存空间的对象引用就不会调用对象的初始化方法。
class MusicPlayer(object):
def __new__(cls, *args, **kwargs):
# 1.创建对象时,new方法会被自动调用
print("创建对象,分配空间")
# 2.为对象分配空间
instance = super().__new__(cls)
# 3.返回对象的引用
return instance
def __init__(self):
print("初始化播放器")
# 创建播放器对象
player = MusicPlayer()
print(player)