Python 中的 __new__

pythonserver side programmingprogramming更新于 2024/2/18 20:41:00

Python 是一种用途广泛、应用广泛的编程语言,以其简单性和广泛的功能集而闻名。它的一个不太受重视但功能强大的功能是 new 方法,它为开发人员提供了一种自定义项目引入的独特方式。本文对 Python 中的 new 方法进行了全面而引人入胜的回顾,讨论了其目的、用例和质量实践。

第 1 部分:New 的本质

1.1:理解 New

在 Python 中,new 是一种特殊方法,属于类而不是类的示例。它负责创建和返回类的新实例。 new 方法在 init 方法之前调用,通常在您想要控制项目出现方法或资产分配时应用。

1.2:New 的目的

new 的主要目的是提供对对象实例化的更大控制,允许开发人员自定义对象创建、管理资源分配,甚至实现单例设计模式。虽然不常用,但如果正确使用,new 可以成为一个强大的工具。

第 2 节:New 的基本示例

为了揭示 recent 的用法,让我们看一个简单的例子。假设我们有一个名为"Person"的类,我们需要确保只创建名称非空的实例。

  • 使用 __new__ 方法定义 Person 类。

  • 检查"call"参数是否始终为空。

  • 如果名称为空,则引发 ValueError。

  • 如果名称有效,则调用超类的 __new__ 方法来创建并返回新实例。

  • 定义 __init__ 技术来设置"name"属性。

class Person:
   def __new__(cls, name):
      if not name:
         raise ValueError("Name cannot be empty.")
      return super().__new__(cls)
   
   def __init__(self, name):
      self.name = name

try:
   john = Person("John")
   print(john.name)  # Output: John
   empty_person = Person("")
except ValueError as e:
   print(e)

输出

John
Name cannot be empty.

在此示例中,我们创建一个"Person"类,该类仅允许具有非空名称的实例。

第 3 节:高级用例

3.1:实现单例设计模式

新方法的一个实际用例是实现单例设计模式,确保只能创建一个类的实例。

  • 定义 Singleton 类,并将类属性 _instance 设置为 None。

  • 在 Singleton 类中实现 __new__ 方法。

  • 检查 _instance 是否为 None。

  • 如果 _instance 为 None,则利用超类的 __new__ 方法创建一个新实例并将其分配给 _instance。

  • 返回现有的_instance。

class Singleton:
   _instance = None
   
   def __new__(cls, *args, **kwargs):
      if cls._instance is None:
         cls._instance = super().__new__(cls)
      return cls._instance

singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2) 

输出

True

如果 _instance 为 None,则使用超类的 __new__ 方法创建一个新实例并将其分配给 _instance。

3.2:为不可变类自定义对象创建

new 方法的另一个用例是为不可变类自定义对象引入。让我们看一下下面使用自定义字符串类的示例 -

  • 定义从 str 类继承的 CustomString 类。

  • 在 CustomString 类中实现 __new__ 方法。

  • 验证提供的值是否是 str 的实例。

  • 如果该值不是 str 的实例,则将其转换为字符串。

  • 使用字符串的大写模型调用超类的 __new__ 方法来创建并返回一个新实例。

class CustomString(str):
   def __new__(cls, value):
      if not isinstance(value, str):
         value = str(value)
      return super().__new__(cls, value.upper())

custom_string = CustomString("hello world")
print(custom_string)

输出

HELLO WORLD

在此示例中,我们创建一个 CustomString 类,该类继承自内置 str 类并自定义对象创建过程:

第 4 节:使用 __new__ 的最佳实践

4.1:始终调用超类的 __new__ 方法

在强制执行 __new__ 方法时,使用 `splendid().__new__(cls, *args, **kwargs)` 调用超类的 __new__ 方法非常重要。这可确保对象引入过程遵循最佳继承链,并分配任何所需的源。

4.2:谨慎使用 __new__

由于 __new__ 是一个强大但可能令人困惑的功能,因此应谨慎使用,并且仅在必要时使用。在大多数情况下,Python 提供的默认对象创建过程就足够了。仅当需要精确控制实例化过程时才使用 __new__,例如在 Singleton 模式中或使用不可变类时。

4.3:了解 __new__ 和 __init__ 之间的区别

请记住,__new__ 负责创建和返回新实例,而 __init__ 负责初始化实例。这两种方法都有不同的功能,不应互换使用。通常,当您想要控制创建过程时使用 __new__,而 __init__ 用于初始化实例属性。

结论

Python 中的 __new__ 方法是一种强大但鲜为人知的函数,它允许开发人员自定义项目引入并操纵资源的分配。通过了解其目的、使用实例和良好的实践,开发人员可以利用 __new__ 的整体能力并提高其 Python 程序的灵活性和效率。


相关文章