本文共 1316 字,大约阅读时间需要 4 分钟。
new() 方法的特性
new() 方法是Python中用于实例化类的特殊方法。它在类准备创建实例时被自动调用,并且它是一个静态方法,即使没有显式地使用装饰器也会如此。这一点与普通的类方法不同。
通常情况下,类实例化的流程如下:
class MyClass(object): def __init__(self, *args, **kwargs): ...myinstance = MyClass(*args, **kwargs)
在实例化过程中,Python首先会调用当前类的 new() 方法:
def __new__(cls, *args, **kwargs): ...
其中,cls 表示正在实例化的类。为了确保新实例正确继承自父类,通常需要调用父类的 new() 方法:
def __new__(cls, *args, **kwargs): return object.__new__(cls)
如果类没有定义 new() 方法,Python会自动调用其父类的 new() 方法,直到追溯到 object 类的 new() 方法。因此,所有新式类(继承自 object)的实例化都会调用 object.new()。
需要注意的是,在重写 new() 方法时,必须谨慎处理父类的 new() 方法。例如:
class Foo(object): def __new__(cls, *args, **kwargs): return object.__new__(cls, *args, **kwargs)
在这种情况下,Foo 实例会被直接创建为 object 类的实例,而不会调用 Foo 的 init() 方法。
此外,如果 new() 方法返回一个非当前类的实例,init() 方法就不会被调用。例如:
class Foo(object): def __new__(cls, *args, **kwargs): return Stranger.__new__(cls, *args, **kwargs)
在这种情况下,Foo 实例会被创建为 Stranger 类的实例。
关于单例模式,通常用于确保类只创建一个实例,以节省内存。实现单例的基本方式如下:
class B(object): __instance = None def __new__(cls): if cls.__instance is None: cls.__instance = object.__new__(cls) return cls.__instance
在这种情况下,每次调用 B()都会返回同一个实例。
总结:
通过合理定义 new() 方法,可以控制实例化过程,确保类的唯一性或其他特定需求。
转载地址:http://agafk.baihongyu.com/