python中的魔术方法__

494 查看

1、__ new__, __ init__, __ call__

__ new__(cls, *args, **kwargs) 创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身
__ init__(self, *args, **kwargs) 创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化;注意,这里的第一个参数是self即对象本身
__ call__(self, *args, **kwargs) 如果类实现了这个方法,相当于把这个类型的对象当作函数来使用,相当于 重载了括号运算符

继承自object的新式类才有__ new__
__ new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

__ new__必须要有返回值,返回实例化出来的实例,这点在自己实现_ new__时要特别注意,可以return父类__ new__出来的实例,或者直接是object的 _new__出来的实例

__ init__有一个参数self,就是这个 __ new__返回的实例,__ init__在__ new__的基础上可以完成一些其它初始化的动作,__ init__不需要返回值

若_ _new__没有正确返回当前类cls的实例,那__ init__是不会被调用的,即使是父类的实例也不行

http://www.cnblogs.com/ifantastic/p/3175735.html

通常来说,新式类开始实例化时,new()方法会返回cls(cls指代当前类)的实例,然后该类的init()方法作为构造方法会接收这个实例(即self)作为自己的第一个参数,然后依次传入new()方法中接收的位置参数和命名参数。

注意:如果new()没有返回cls(即当前类)的实例,那么当前类的init()方法是不会被调用的。如果new()返回其他类(新式类或经典类均可)的实例,那么只会调用被返回的那个类的构造方法。

2、__ del__
它不实现语句 del x (以上代码将不会翻译为 x.__ del__() )。它定义的是当一个对象进行垃圾回收时候的行为。当一个对象在删除的时需要更多的清洁工作的时候此方法会很有用,比如套接字对象或者是文件对象。注意,如果解释器退出的时候对象还存存在,就不能保证 __ del__ 能够被执行

3、用于比较的魔术方法

http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue6/a-guid…