📜  __new__ 在Python中(1)

📅  最后修改于: 2023-12-03 15:13:14.343000             🧑  作者: Mango

Python中的__new__

在Python中的每个类都有一个名为__new__的方法。这个方法会在创建这个类的实例(对象)时被调用,它是一个静态方法。

__new__方法是如何工作的

在每个类中,“new”方法是一个静态方法,用于创建并返回一个新的对象。该方法被调用时,已经知道要创建哪个类的实例(对象),并已确定要传递哪些参数。通常,”new”方法执行以下步骤:

  1. 创建一个新对象。
  2. 为对象设置任何必要的状态(状态通常是对象的实例变量)。
  3. 返回新对象的引用。

以下是一个示例,展示了如何在类中实现__new__方法:

class Example:
    def __new__(cls, *args, **kwargs):
        obj = super().__new__(cls)
        obj.attribute = 'value'
        return obj

在这个示例中,创建了一个类Example。它有一个__new__方法,该方法创建一个新的实例对象,并使用obj.attribute='value'为这个对象设置了一些状态,最后返回该对象的引用。

__init__方法的区别

__new__方法不同,__init__方法是一个实例方法,在实例化时被调用。在__init__方法中,我们通常初始化对象的属性。

以下是一个示例,展示了__init____new__方法之间的区别:

class Example:
    def __new__(cls, *args, **kwargs):
        print('Creating new instance')
        return super().__new__(cls)
        
    def __init__(self, *args, **kwargs):
        print('Initializing instance')
        self.attribute = 'value'

在这个示例中,我们创建了一个Example类并实现了它的__new____init__方法。当我们尝试实例化这个类时,我们将得到以下输出:

Creating new instance
Initializing instance
自定义__new__

__new__方法可以被自定义以满足特定的需求。例如,假设我们想要确保创建的对象是单例的(即在应用程序中只有一个实例),我们可以使用下面这个示例中的代码:

class Singleton:
    _instance = None
    
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.initialized = False
        return cls._instance
    
    def __init__(self, *args, **kwargs):
        if self.initialized:
            return
        print('Initializing Singleton object.')
        self.initialized = True

在这个示例中,创建了一个Singleton类。它的__new__方法确保只存在一个实例对象(比较了单例类的类变量 _instance 是否为 None),如果实例对象还不存在,就创建实例对象,并初始化它;如果实例对象已存在,直接返回现有实例对象。

总结
  • __new__方法是静态方法,用于创建并返回新对象的实例。
  • __init__方法是实例方法,在实例化时被调用,用于初始化对象的属性。
  • __new__方法可以自定义以满足特定需求,如确保对象的单例化。