c语言编程笔录

首页 >   > 笔记大全

笔记大全

详解Python中 new 方法的作用

更新时间:2023-07-10

Python中 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 类)。