详解Python中 new 方法的作用
更新时间:2023-07-10Python中 new 方法的作用
在Python中,__new__()是一个具有特殊重要性的内置方法。它始终是实例化对象的第一个方法。然而,与 __init__()不同,__new__()可以创建一个类的实例,并将其返回给调用方。在调用 __init__() 之前,__new__()方法会确保对象的正确初始化。通常情况下,我们不需要在自己的类定义中重写__new__(),因为大多数时候,__new__()定义已经在Python的object类中实现了。
__new__()方法的应用
__new__方法常用于实例化一个不可变类型的对象,如str, tuple, frozenset等:
class MyString(str): def __new__(cls, *args): print("Creating an instance...") return super().__new__(cls, *args) s = MyString("Hello world!") print(s) # 输出:"Hello world!"
在这个例子中,我们创建了一个MyString类来扩展Python的内置字符串类型str。我们重写 __new__() 方法,并在该方法中添加了一个打印语句。当我们实例化一个 MyString 对象时, __new__() 方法会被调用,并输出 "Creating an instance..." 字符串。然后,我们的代码会调用父类的__new__()方法,并利用其返回值来完成对象初始化。
使用__new__() 实现单例模式
单例模式是一种创建一个类的唯一实例的设计模式。在Python中,通过重写 __new__() 方法可以实现单例模式:
class Singleton: _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super().__new__(cls, *args, **kwargs) return cls._instance s1 = Singleton() s2 = Singleton() print(id(s1) == id(s2)) # 输出:"True"
在这个例子中,我们定义了一个 Singleton 类,并定义了一个类变量 _instance。当我们实例化一个 Singleton 对象时,__new__() 方法会返回 Singleton 的唯一实例。在 __new__() 方法内部,我们检查了 _instance 是否为 None(即检查该类是否已有实例化对象)。如果 _instance 为 None,则我们调用父类的__new__()方法来实例化该类,并将实例赋给 _instance 变量。如果 _instance 不为 None,则直接返回 _instance 变量指向的对象。
在元类中使用 __new__() 方法
元类是Python中高级概念之一,用于创建和控制类。在元类中,__new__() 方法是一个非常重要的方法,它在类的创建过程中被调用:
class Meta(type): def __new__(cls, name, bases, attrs): print("Creating a class...") cls = type.__new__(cls, name, bases, attrs) return cls class MyClass(metaclass=Meta): pass m = MyClass() print(type(m)) # 输出:"MyClass"
在这个例子中,我们定义了一个 Meta 元类,重写了它的__new__() 方法。我们定义了一个 MyClass 类,将其元类设置为 Meta。当我们实例化一个 MyClass 对象时,__new__() 方法会被调用,并输出 "Creating a class..." 字符串。然后,该方法会调用元类的父类的 __new__() 方法,并将返回的类作为返回值(即创建的 MyClass 类)。