class A(object):
def __init__(self):
print "init"
def __new__(cls,*args, **kwargs):
print "new %s"%cls
return object.__new__(cls, *args, **kwargs)
A()
#输出:
new <class '__main__.A'>
init
继承自object的新式类才有new
new至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
new必须要有返回值,返回实例化出来的实例,这点在自己实现new时要特别注意,可以return父类new出来的实例,或者直接是object的new出来的实例
init有一个参数self,就是这个new返回的实例,init在new的基础上可以完成一些其它初始化的动作,init不需要返回值
若new没有正确返回当前类cls的实例,那init是不会被调用的,即使是父类的实例也不行
class A(object):
pass
class B(A):
def __init__(self):
print "init"
def __new__(cls,*args, **kwargs):
print "new %s"%cls
return object.__new__(A, *args, **kwargs)
b=B()
print type(b)
#输出:
new <class '__main__.B'>
<class '__main__.A'>
如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而 __new__()则是生产部经理,__new__()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出 货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。
__new__()方法的特性:
__new__()方法是在类准备将自身实例化时调用。
__new__()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
类的实例化和它的构造方法通常都是这个样子:
class MyClass(object):
def __init__(self, *args, **kwargs):
...
# 实例化
myclass = MyClass(*args, **kwargs)
#正如以上所示,一个类可以有多个位置参数和多个命名参数,而在实例化开始之
#后,在调用 __init__()方法之前,Python首先调用__new__()方法:
def __new__(cls, *args, **kwargs):
...