深入了解 Python 中的 __new__() 方法
作者:互联网
在 Python 中,是一个内置的构造函数方法,用于控制新实例的创建。是对象类的静态方法。当您通过调用类创建新对象时,Python 会先调用 __new__() 方法来创建对象,然后调用 __init__() 方法来初始化对象的属性。__new__()
__new__()
该方法负责创建和返回类的新实例。它至少需要一个参数,即类本身,以及传递给构造函数的任何其他参数。__new__()
下面是重写该方法的简单类的示例:__new__()
class MyClass: def __new__(cls, *args, **kwargs): print(“Creating new instance...”) instance = super().__new__(cls) return instance def __init__(self, name): self.name = name obj = MyClass(“John”) 打印(obj.name)
在此示例中,该方法在方法之前调用。但是,负责初始化其状态。它将实例的属性设置为传入的值。__new__()
__init__()
__init__()
name
当您需要以某种方式自定义对象创建过程时,通常使用该方法,例如:__new__()
1. 创建不可变对象
如果要创建一个不可变的对象,这意味着其值在创建后无法更改,则可以使用该方法创建对象的新实例并初始化其状态。由于对象是不可变的,因此无需定义方法。__new__()
__init__()
类 ImmutableObject: def __new__(cls, value): instance = super().__new__(cls) instance._value = value 返回实例 @property def value (self): return self._value
在此示例中,我们将创建一个具有单个属性的类,该属性一旦设置就无法更改。我们重写该方法以创建对象的新实例并初始化其属性。由于对象是不可变的,因此无需定义方法。ImmutableObject
value
__new__()
value
__init__()
2. 创建单例对象
如果要确保只能创建特定类的一个实例,则可以使用该方法检查是否已创建实例。拥有类的单个实例,我们可以获得以下好处:__new__()
- 跨应用程序的共享状态或资源 — 例如数据库连接、记录器等;
- 内存效率 — 主要是因为我们确保内存中只存储一个对象。
class SingletonObject: _instance = None def __new__(cls, *args, **kwargs): 如果不是 cls._instance: cls._instance = super().__new__(cls) 返回cls._instance
在此示例中,我们将创建一个类,以确保只能创建该类的一个实例。我们使用类变量来跟踪是否已创建实例。在该方法中,我们检查是否已创建实例,如果没有,则创建一个新实例并为其设置变量。如果已经创建了实例,我们只需返回现有实例。SingletonObject
_instance
__new__()
_instance
3. 使用不同的构造函数创建对象
如果要创建具有采用不同参数的不同构造函数的对象,则可以使用该方法确定应调用哪个构造函数,并将相应的参数传递给它。__new__()
类 MultiConstructorObject: def __new__(cls, *args, **kwargs): if kwargs and kwargs['type'] == 'foo': return cls._from_foo(*args) else: return cls._from_bar(*args) @classmethod def _from_foo(cls, value): instance = super().__new__(cls) instance._value = value * 2 返回实例 @classmethod def _from_bar(cls, value): instance = super().__new__(cls) instance._value = value * 3 返回实例 @property def 值(self): 返回 self._value
在此示例中,我们将创建一个类,该类可以根据关键字参数的值使用不同的构造函数进行初始化。我们使用该方法来确定应该调用哪个构造函数,并将适当的参数传递给它。MultiConstructorObject
type
__new__()
4. 使用自定义内存管理创建对象
如果要以自定义方式管理对象的内存使用情况,则可以使用该方法以自定义方式为对象分配内存。__new__()
import ctypes class CustomMemoryObject: def __new__(cls, value): size = ctypes.sizeof(cls) address = ctypes.pythonapi.PyObject_Malloc(size) instance = ctypes.cast(address, ctypes .py_object) .value instance._value = value return instance def __del__(self): size = ctypes.sizeof(self.__class__) address = ctypes.cast(self, ctypes.c_void_p).value ctypes.pythonapi.PyObject_Free(address) @property def value (self): return self._value
在此示例中,我们将创建一个管理其自己的内存分配和释放的类。我们使用模块以自定义方式为对象分配内存,并定义一个自定义方法在删除对象时释放内存。请注意,这是一个更高级的用例,应仅在必要时使用。CustomMemoryObject
ctypes
__del__()
通常,仅当需要自定义对象创建过程时,才应使用该方法。对于大多数用例,Python 提供的默认对象创建行为就足够了。__new__()