在Python中,我们目前已经学了3个魔术方法了,分别是__init__()
、__str__()
、__del__()
,接下来介绍一下__new__()
方法。
使用类名()创建对象时,Python的解释器首先会调用__new__方法
为对象分配空间。
new是一个由object积累提供的内置的静态方法,主要作用有两个:
○ 在内存中为对象分配空间
○ 返回对象的引用
Python解析器获得对象的引用后,将引用作为第一个参数,传递给__init__方法
重写__new__方法
的代码非常固定,一定要使用return super(). __new__(cls)
,否则Python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法。
__new__方法
是一个静态方法,在调用时,要求将自身类信息cls作为参数传递到这个方法中,这个方法属于object类中的一个静态方法。
案例:
定义一个播放器类
class MusicPlayer(object):
重写__new__()魔术方法
def new(cls, *args, **kwargs):
print('1、开辟内存空间')
print('2、返回实例化对象引用地址')
return super().new(cls)
def init(self, name):
self.name = name
1、实例mp1对象
mp1 = MusicPlayer('红色的高跟鞋')
print(mp1)
2、实例化mp2对象
mp2 = MusicPlayer('春夏秋冬')
print(mp2)
4、单例模式的代码实现
定义一个播放器类
class MusicPlayer(object):
定义一个类属性,如instance,用于记录之前实例化对象返回的内存引用
instance = None
重写__new__()魔术方法
def new(cls, *args, **kwargs):
判断实例化时有没有分配过内存空间
if cls.instance is None:
cls.instance = super().new(cls)
return cls.instance
def init(self, name):
self.name = name
1、实例mp1对象
mp1 = MusicPlayer('红色的高跟鞋')
print(mp1)
2、实例化mp2对象
mp2 = MusicPlayer('春夏秋冬')
print(mp2)
注:类属性在内存中是一个特殊的存在,其不用于以前讲过的局部变量(局部变量当函数执行完毕后,其会被内存所销毁)。但是类属性一旦定义,除非对象以及这个类在内存中被销毁了,否则其不会自动销毁。