python
文章目录
- python
- 一、python中类的__new__方法和__init__方法
- 二、第三行解释说明 instance = super().__new__(cls)
- 三、__init__,__new__返回的是什么?
- 四、debug代码运行中cls,instance,self都是什么东西
- 五、什么时候会重写__new__一般都怎么用,举个例子
- 六、官方链接
一、python中类的__new__方法和__init__方法
在Python中,__new__
和__init__
是类的两个内置方法,它们在创建和初始化类的实例时起着重要的作用。
__new__
方法是一个静态方法,当我们创建类的新实例时,它会被首先调用。这个方法的主要任务是创建新的实例并返回它。通常,我们使用super().__new__(cls, *args, **kwargs)
来调用父类的__new__
方法,这会返回一个新的实例。然后,这个新的实例会被传递给__init__
方法作为第一个参数。
__init__
方法则是一个实例方法,它在__new__
方法创建新实例后被调用,用于初始化新创建的实例。__init__
方法接收新创建的实例(通常命名为self
)作为第一个参数,然后是我们传递给类构造器的任何参数。
代码例子:
class MyClass:
def __new__(cls, *args, **kwargs):
instance = super().__new__(cls)
# 在这里可以添加一些额外的初始化代码
return instance
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
总的来说,__new__
方法用于创建新的实例,而__init__
方法用于初始化这个新创建的实例。
二、第三行解释说明 instance = super().new(cls)
在Python中,如果一个类没有明确指定它的父类,那么它的父类默认是object
类。代码中,MyClass
没有明确指定父类,所以它的父类是object
类。
在Python中,所有的类都直接或间接地继承自object
类。object
类是最顶层的基类,它提供了一些基本的方法,如__new__
,__init__
,__str__
,__repr__
等。
当我们创建一个新的类,而没有明确指定它的父类时,Python会默认让它继承自object
类。这意味着我们的类会继承object
类的所有方法。
然而,大多数情况下,我们可能不需要直接与object
类交互。我们只需要知道,当我们创建一个新的类时,它会自动继承自object
类,我们可以覆盖object
类的方法来改变它们的行为。
需要注意的是,super().__new__(cls)
这行代码是调用父类(在这个例子中是object
类)的__new__
方法来创建新的实例。这是创建新实例的标准方式,除非我们有特殊的需求,否则通常不需要修改这行代码。
三、init,__new__返回的是什么?
-
因为对象是由
__new__
和__init__
协作构造完成的 (由__new__
创建,并由__init__
定制),所以__init__
返回的值只能是None
,否则会在运行时引发TypeError
。 -
__new__
方法返回的是一个新创建的类的实例。在我们的代码中,__new__
方法通过调用super().__new__(cls)
创建了一个新的MyClass
的实例,并将其返回。这个新创建的实例会被传递给__init__
方法作为第一个参数,用于初始化实例。
四、debug代码运行中cls,instance,self都是什么东西
怎么理解 cls是<class ‘main.MyClass’>,instance是<main.MyClass object at 0x7f4999b6c050>
在Python中,cls
是一个常用的约定,用于表示当前类。在类方法(如__new__
)中,cls
是自动传递的,就像实例方法中的self
一样。
在我们的代码中,cls
是<class '__main__.MyClass'>
,这表示cls
就是MyClass
这个类。
instance
是<__main__.MyClass object at 0x7f4999b6c050>
,这表示instance
是MyClass
的一个实例,0x7f4999b6c050
是这个实例在内存中的地址。
所以,super().__new__(cls)
这行代码的作用是创建一个MyClass
的新实例,并将这个新实例赋值给instance
。然后,__new__
方法返回这个新创建的实例。
五、什么时候会重写__new__一般都怎么用,举个例子
在Python中,我们通常不需要重写__new__
方法,因为默认的实现已经足够用了。但在某些特殊情况下,我们可能需要重写__new__
方法。以下是一些例子:
- 实现单例模式:单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。我们可以通过重写
__new__
方法来实现单例模式。
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls, *args, **kwargs)
return cls._instance
在这个例子中,我们在__new__
方法中检查是否已经有一个实例存在。如果存在,我们就返回这个实例,否则我们创建一个新的实例。
- 控制实例的创建:有时,我们可能想要控制实例的创建。例如,我们可能想要限制只能创建特定数量的实例。我们可以通过重写
__new__
方法来实现这个功能。
class LimitedInstances:
_instances = []
limit = 3
def __new__(cls, *args, **kwargs):
if len(cls._instances) >= cls.limit:
raise RuntimeError("Cannot create more instances")
instance = super().__new__(cls, *args, **kwargs)
cls._instances.append(instance)
return instance
在这个例子中,我们在__new__
方法中检查是否已经创建了足够多的实例。如果已经创建了足够多的实例,我们就抛出一个异常,否则我们创建一个新的实例。
演示:
六、官方链接
https://docs.python.org/zh-cn/3/reference/datamodel.html#object.new
https://docs.python.org/zh-cn/3/reference/datamodel.html#object.init
标签:__,python,instance,init,实例,new,cls From: https://blog.csdn.net/weixin_73330544/article/details/136782362