赞
赏
Python 中的 __new__()
方法是一种负责创建 类实例 的 静态方法,且该方法会在 init() 初始化方法之前被调用。一般情况下,我们在覆写 __new__()
的实现之前,都会先使用 super 调用父类的 new 方法。
def new(cls, *args, **kwargs):
new 方法可以有多个位置参数和多个命名参数。
Python 中的 __new__()
方法是在新式类中新出现的方法,Python 中的构造方法 __init__()
负责将类实例化,而在 __init__()
执行之前,__new__()
负责制造这样的一个实例对象,以便 __init__()
去让该实例对象更加的丰富(为其添加属性等)。
同时,__new__()
方法还决定是否要使用该 __init__()
方法,因为 __new__()
可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。
Python 中的 new 方法会在 init 方法之前被调用
print("嗨客网(www.haicoder.net)")
class Person(object):
def __new__(cls,*args,**kwargs):
print("call __new__()")
instance = super().__new__(cls)
return instance
def __init__(self):
print("call __init__()")
p = Person()
程序运行后,控制台输出如下:
我们创建了一个 Person 类,Person 类继承自 object 类,接着,我们 重写 了 __new__
方法和 __init__
方法。
最后,我们实例化了 Person 类,我们发现,__new__
方法会在 __init__
方法之前被调用。
使用new方法可以创建其他类实例
print("嗨客网(www.haicoder.net)")
class Person(object):
def __new__(cls, *args, **kwargs):
print("call Person __new__()")
instance = super().__new__(cls)
return instance
class Student(object):
def __new__(cls, *args, **kwargs):
print("call Student __new__()")
instance = object.__new__(Person, *args, **kwargs)
return instance
stu = Student()
print("Type stu =", type(stu))
程序运行后,控制台输出如下:
我们创建了一个 Person 类和一个 Student 类,并且都重写了它们的 __new__
方法,在 Student 类的 __new__
方法里,我们调用的 __new__
的第一个参数传递的是 Person 类。
因此,我们在实例化 Student 类实例时,其实创建的是 Person 类的实例,而不是 Student 类的实例。
Python 中的 __new__()
方法是一种负责创建类实例的静态方法,且该方法会在 init() 初始化方法之前被调用。一般情况下,我们在覆写 __new__()
的实现之前,都会先使用 super 调用父类的 new 方法。
Python 中的 __new__()
方法是在新式类中新出现的方法,Python 中的构造方法 __init__()
负责将类实例化,而在 __init__()
执行之前,__new__()
负责制造这样的一个实例对象,以便 __init__()
去让该实例对象更加的丰富(为其添加属性等)。
同时,__new__()
方法还决定是否要使用该 __init__()
方法,因为 __new__()
可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。