Python(二十五)面向对象编程,__init__,__new__,__str__,__repr__等重要方法

发布于:2022-12-03 ⋅ 阅读:(131) ⋅ 点赞:(0)

一. 类的双下划线方法

A. 不重要的方法

1.len方法

# 在类中创建一个len的类方法,调用类创建实例,调用len方法并传入实例(对象)。len方法中结尾要有return 

2.hash方法

 3.eq方法

# 判断两个对象是否相等的时候,就会触发eq方法来进行判断 

4.item方法

可以把一个对象变成dict,可以像dict一样增删改查

# 把self(对象)变成一个字典,根据item作为字典的key进行相应的操作。 

B.重要的方法

1.str&repr:描述对象信息,其中__str__强调可读性,让电脑前的人看懂;__repr__强调准确性,给电脑看的。

使用场景:比如,我们在终端上创建了一个类,并将这个类打印出来,类默认转换的字符串并没有含有有意义的信息,仅有内存和实例的ID。

——>我们可以通过__str__或__repr__的方法,自定义类的字符串描述,实现所谓的“类到实例化的转化”:

# 可以看见,我们直接打印类或打印原始的__str__和__repr__方法,打印出来的是没有太多直观信息的内容,所以我们要对其进行重写:

# 我们重新编辑了__str__方法后,无论我们是打印输出该方法,还是直接打印该类的实例,输出的都是__str__方法返回的内容。 对__repr__进行重新编写后:

# 无论是打印实例本身,还是实例的__repr__,都是编辑后的内容;但我们可以注意到,在Pycharm下,直接类,仍然是类本身的原始内容。

另外还需要注意的是,如果将对象放在容器中进行输出,调用的是__repr__ 方法:

  

注:__repr__的结果是让解释器用的。__repr__用jiao'hu'mo下提示回应, 如果没有重写__str__方法,但重写了__repr__方法时,所有调用__str__的时机都会调用__repr__方法。

2.del析构方法

看待该方法可以和__init__形成对比,__init__是一个构造方法,在该类实例化的时候会自动执行的方法,可以在该方法下放入一些需要直接赋予实例的一些属性‘而__del__则是对象在被垃圾回收的时候起作用的一个方法,它的执行一般也就意味着对象不能够继续引用, 回收内存.

del析构方法有两种实现场景:

A.执行完脚本后,对象结束其生命周期,del’自动执行‘:

 

# 将类实例化成对象f后,并且打印完’这应该是脚本最后一句‘,整个脚本执行完毕,此时再执行del析构方法,将内存释放。

B.手动执行

 

# 手动书写脚本:del f。删掉对象f,也就是自动调用了del析构方法来释放内存。

3.new方法

还是从__init__开始说起,__init__方法是在类实例化后,对实例的属性进行初始化,那也就是说在自动执行__init__之前要进行创建实例的操作,这个操作就是有__new__方法来完成的。

重写__new__方法:

# 如图所示我们可以看到new方法的基本格式,其中return的内容是new方法的寻找并执行的机制,如果在该类中如果没有找到定义的类方法,那么就向父类中依次去找,直到找到为止,其中object类便是所有类的基类,也可以说是本次寻找的宇宙尽头。

===》

__new__(cls[, ...]) 是在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给__init__
__new__对当前类进行了实例化,并将实例返回,传给__init__self。但是,执行了__new__,并不一定会进入__init__,只有__new__返回了,当前类cls的实例,当前类的__init__才会进入。
__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行,将没有__init__被调用。
__new__方法主要是当你继承一些不可变的 class 时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。

号外:单例模式:

举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

负责执行__init__,进行一些实例初始化前的工作

 单例模式?

4.call方法

一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__


网站公告

今日签到

点亮在社区的每一天
去签到