python中类的__new__方法和__init__方法

python



一、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__返回的是什么?

  1. 因为对象是由 __new____init__ 协作构造完成的 (由 __new__ 创建,并由 __init__ 定制),所以 __init__ 返回的值只能是 None,否则会在运行时引发 TypeError

  2. __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>,这表示instanceMyClass的一个实例,0x7f4999b6c050是这个实例在内存中的地址。

所以,super().__new__(cls)这行代码的作用是创建一个MyClass的新实例,并将这个新实例赋值给instance。然后,__new__方法返回这个新创建的实例。

五、什么时候会重写__new__一般都怎么用,举个例子

在Python中,我们通常不需要重写__new__方法,因为默认的实现已经足够用了。但在某些特殊情况下,我们可能需要重写__new__方法。以下是一些例子:

  1. 实现单例模式:单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。我们可以通过重写__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__方法中检查是否已经有一个实例存在。如果存在,我们就返回这个实例,否则我们创建一个新的实例。

  1. 控制实例的创建:有时,我们可能想要控制实例的创建。例如,我们可能想要限制只能创建特定数量的实例。我们可以通过重写__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

  • 36
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吊肩三角裤

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值