__new__()方法是类的构造器,返回类实例。Python 用户可以对内建类型进行派生,因此,需要一种途径来实例化不可变对象,比如,派生字符串,数字,等等。在这种情况下,解释器则调用类的__new__()方法,__new__()会调用父类的__new__()来创建对象(向上代理)。调用__new__时,需要一个传入参数 cls,cls就是__new__方法返回的实例所属的类。
>>> class float2(float): def __new__(cls, arg = 0): return round(float.__new__(cls, arg),2) >>> a = float2(1.3333) >>> a 1.33
由于 Python 具有垃圾对象回收机制(靠引用计数),这个函数要直到该实例对象所有的引用都被清除掉后才会执行。
del 语句删除一个对象的引用,当引用计数为0时,会调用__del__方法。Python 中的解构器是在实例释放前提供特殊处理功能的方法,它们通常没有被实现,因为实例很少被显式释放。
super()函数在新式类中引入,用这个函数可以找出的父类,然后调用父类相关的属性。一般情况下,程序员可能仅仅采用非绑定方式调用祖先类方法。super语法如下:
super(type[, obj])
给出 type, super()“返回此 type 的父类”。如果你希望父类被绑定,你可以传入 obj 参数(obj必须是 type 类型的).否则父类不会被绑定。obj 参数也可以是一个类型,但它应当是 type 的一个子类。通常,当给出 obj 时:
如果 obj 是一个实例,isinstance(obj,type)就必须返回 True
如果 obj 是一个类或类型,issubclass(obj,type)就必须返回 True
来看看单例模式如何实现,最简单的想到使用类属性。
>>> class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): print cls.__name__, Singleton.__name__ if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance >>> a = Singleton() Singleton Singleton >>> b = Singleton() Singleton Singleton >>> id(a),id(b) (47568656L, 47568656L)
类Singleton定义中,cls实际就是Singleton,隐藏可以写成
cls._instance = super(cls, cls).__new__(cls, *args, **kwargs)