python __new__, __del__, super

1. __new__()  类“构造器”方法

__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


2. __del__() 类"解构器"方法

由于 Python 具有垃圾对象回收机制(靠引用计数),这个函数要直到该实例对象所有的引用都被清除掉后才会执行。

del 语句删除一个对象的引用,当引用计数为0时,会调用__del__方法。Python 中的解构器是在实例释放前提供特殊处理功能的方法,它们通常没有被实现,因为实例很少被显式释放。


3. super()

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)


你可能感兴趣的:(python __new__, __del__, super)