[Python]python面向对象 __new__方法及单例设计
__new__
方法
- 使用 类名() 创建对象时,
Python
的解释器 首先 会 调用__new__
方法为对象 分配空间 __new__
是一个 由object
基类提供的 内置的静态方法,主要作用有两个:- 1) 在内存中为对象 分配空间
- 2) 返回 对象的引用
Python
的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给__init__
方法
_new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() 启动之前,__new__() 决定是否要使用该 __init__() 方法,因为__new__() 可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。
如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参数则是生产所需原料,__init__()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而__new__()则是生产部经理,__new__()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。(摘自http://www.cnblogs.com/ifantastic/p/3175735.html)
类的实例化:
class MyHome(object): def __init__(self, *args, **kwargs): pass # 实例化 my_home = MyHome(*args, **kwargs)
创建类对象时会自动调用__new__方法,如果__new__方法重写则需调用其父类,切记返回引用,return super().__new__(cls),否则__init__方法不能获得内存即不能够初始化
__new__
方法在单例设计模式中的应用
单例----让类创建的对象在系统中只有唯一的一个实例,从如下的代码中可以看到,定义一个instance为None的类属性,用于记录单例对象的引用。在__new__方法重写中首先判断类属性是否为空对象None,如果is None 为True,则调用父类的方法:
cls.instance = super().__new__(cls)
否则,返回类属性保存的对象引用
return cls.instance
class MusicPlayer(object): # 定义类属性 instance = None # __new__方法重写 def __new__(cls, *args, **kwargs): # 1.判断类属性是否是空对象 if cls.instance is None: # 2.调用父类的方法,为第一个对象分配空间 cls.instance = super().__new__(cls) # 3.返回类属性保存的对象引用 return cls.instance player1 = MusicPlayer() print(player1) player2 = MusicPlayer() print(player2)
结果:
<__main__.MusicPlayer object at 0x000002298A38F128>
<__main__.MusicPlayer object at 0x000002298A38F128>
可以看到,此时player1与player2的对象内存地址一致。