编程语言
首页 > 编程语言> > 深入了解 Python 中的 __new__() 方法

深入了解 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

在此示例中,我们将创建一个具有单个属性的类,该属性一旦设置就无法更改。我们重写该方法以创建对象的新实例并初始化其属性。由于对象是不可变的,因此无需定义方法。ImmutableObjectvalue__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

在此示例中,我们将创建一个类,该类可以根据关键字参数的值使用不同的构造函数进行初始化。我们使用该方法来确定应该调用哪个构造函数,并将适当的参数传递给它。MultiConstructorObjecttype__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

在此示例中,我们将创建一个管理其自己的内存分配和释放的类。我们使用模块以自定义方式为对象分配内存,并定义一个自定义方法在删除对象时释放内存。请注意,这是一个更高级的用例,应仅在必要时使用。CustomMemoryObjectctypes__del__()

通常,仅当需要自定义对象创建过程时,才应使用该方法。对于大多数用例,Python 提供的默认对象创建行为就足够了。__new__()

标签:Python,构造函数,new
来源: