ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

深入了解 Python 中的 __new__() 方法

2023-03-08 11:48:52  阅读:397  来源: 互联网

标签: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
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有