目录

1. __new__(cls[, ...])

2. __init__(self[, ...])

3. __del__(self)


1. __new__(cls[, ...])

__new__ 是对象实例化时调用的第一个方法,调用以创建一个 cls 类的新实例;

__new__ 将所请求实例所属的类作为第一个参数,即 cls 参数,其他参数会直接传给 __init__ 方法;

__new__ 通常不需要重写,默认执行即可;如果重写,一般用于允许不可变类型的子类 (例如 int, str 或 tuple) 定制实例创建过程,也常会在自定义元类中被重载以便定制类创建过程;

典型的实现会附带适宜的参数使用 super().__new__(cls[, ...]),通过父类的 __new__ 方法创建一个类的新实例,然后根据需要修改新创建的实例再将其返回。

#创建不可变类型 tuple 的子类
class Newtest(tuple):#调用 __new__ 方法,改写子类在对象实例化时操作def __new__(cls, inputtuple):inputtuple = inputtuple + ('default element',)
#返回 super().__new__(cls[, ...]),通过父类的 __new__ 方法创建修改后子类的新实例return super().__new__(cls, inputtuple)#调用子类创建实例,执行成功
tuplex = (1,2,3)
tupley = Newtest(tuplex)
tupley
(1, 2, 3, 'default element')

2. __init__(self[, ...])

在实例(通过 __new__ 方法)被创建之后,返回调用者之前调用,其参数与传递给类构造器表达式的参数相同,相当于其他面向对象编程语言的构造方法;

实例对象由 __new__ 创建、__init__ 定制, 两个方法协作完成实例对象的构造,__init__ 返回值只能为 None,否则会在构造实例对象时报错;

如一个父类有重写的 __init__ 方法,其派生的子类如果也有重写 __init__ 方法,则需要在子类的 __init__ 方法中确保实例对象构造中父类部分的正确初始化,如添加 super().__init__([args...]) 代码段。

#创建类的 __init__ 方法有返回值
class Inittest():def __init__(self, name):self.name = namereturn self.name#构造实例对象时报错
testx = Inittest('abc')
Traceback (most recent call last):File "<input>", line 1, in <module>
TypeError: __init__() should return None, not 'str'#创建父类
class Inittest():def __init__(self, name):self.name = name
#创建不带父类初始化的子类1
class Initderived1(Inittest):def __init__(self, value):self.value = value
#创建带父类初始化的子类2
class Initderived2(Inittest):def __init__(self, name, value):super().__init__(name)self.value = value#子类1构建实例,调用父类初始化赋值变量失败
test1 = Initderived1('abc')
test1.name
Traceback (most recent call last):File "<input>", line 1, in <module>
AttributeError: 'Initderived1' object has no attribute 'name'#子类2构建实例,调用父类、子类初始化赋值变量成功
test2 = Initderived2('wow','abc')
test2.name
'wow'
test2.value
'abc'

3. __del__(self)

__del__ 方法在实例将被销毁时调用,相当于其他面向对象编程语言的析构方法;

del object 不等于自动调用 object.__del__(),只有当垃圾回收机制回收这个对象时,才会调用 __dell__ 方法;即需要清除所有指向 object 实际地址的所有对象,开启垃圾回收机制, __dell__ 方法才开始执行;

当构建实例对象失败时,也会自动调用 __del__ 方法;

如一个父类有重写的 __del__ 方法,其派生的子类如果也有重写 __del__ 方法,则需要在子类的 __del__ 方法中确保删除实例对象时对其父类部分的正确析构,如添加 super().__del__(self) 代码段。

__del__ 方法可以(但不推荐!)通过创建一个该实例的新引用来推迟其销毁,这被称为对象重生。__del__() 是否会在重生的对象将被销毁时再次被调用是由具体实现决定的,当前的 CPython 实现只会调用一次。

#创建父类
class Deltest():def __init__(self, name):self.name = namedef __del__(self):print(f'调用父类 del 方法')
#创建不带父类析构方法的子类
class Delderived1(Deltest):def __del__(self):print('调用子类1 del 方法')
#创建带父类析构方法的子类
class Delderived2(Deltest):def __del__(self):super().__del__()print('调用子类2 del 方法')#构建实例对象失败,调用 __del__ 方法
test1 = Deltest()
调用父类 del 方法
Traceback (most recent call last):File "<input>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'name'#调用不带父类析构方法的子类,没有执行父类 __del__ 方法
test1 = Delderived1('test1')
del test1
调用子类1 del 方法
#调用带父类析构方法的子类,执行父类 __del__ 方法
test2 = Delderived2('test2')
del test2
调用父类 del 方法
调用子类2 del 方法#只有当垃圾回收机制回收这个对象时,才会调用 __dell__ 方法
test31 = Deltest('test')
test32 = test31
test33 = test32
del test31
del test33
del test32
调用父类 del 方法

类和对象7:构造和析构方法相关推荐

  1. C++对象的构造和析构

    对象的构造和析构 前言 构造和析构函数 析构函数定义及调用 构造函数的分类及调用 无参数构造函数 有参构造函数 拷贝构造函数调用时机 默认构造函数 前言 创建一个对象时,常常需要作某些初始化的工作,例 ...

  2. 【No.7 C++对象的构造与析构时间】

    ==[注意]== 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度 本帖属不定时连载贴,以试卷的形式 ...

  3. (黑马C++)L03 对象的构造和析构

    对象的初始化和清理 构造函数和析构函数会被编译器自动调用,完成对象初始化和对象清理工作.即使自己不提供初始化操作和清理操作,编译器也会增加默认的操作,所以编写类就应该顺便提供初始化函数. 构造函数和析 ...

  4. php构造和析构方法,php5构造函数与析构函数实例

    自php5起,有了构造函数与析构函数. 这使得php更富有面向对象的魅力了. 在php4时,构造函数用的是与类同名的函数来进行构造这个动作. 例如: 复制代码 代码示例: /* * myclass.p ...

  5. C++之临时对象的构造与析构

    1.临时对象产生的时间点 对象作参数(值传递).返回对象(值传递) 2.临时对象析构的时间点(重点.难点) 3.临时对象会降低效率,但是哪些情况必须使用临时对象? [注]真正的临时对象是看不见的,它不 ...

  6. 逆向看C++ new申请堆对象的构造,析构函数调用

    转自:coNgY1 先来放总结,以后回看的时候方便回忆: 对new 而言,如果是空类也会分配一字节. 对 new x[],这种在地址最前面会多分配四字节的空间来保存分配的对象个数. new x[]这种 ...

  7. c++基础知识点(6)类的继承,构造,析构顺序,虚继承等

    学习继承之前,我们先回顾下protected(保护)成员 protected 成员的特点与作用: -对建立其所在类对象的模块来说,它与private成员的性质相同 -对于其派生类来说,它与public ...

  8. 面向过程和面向对象的设计思想、java类、Java类的定义、java对象、对象的创建和使用、类和对象、变量分类、方法分类、构造方法、方法的重载

    1.面向过程和面向对象的设计思想 面向过程:procedure oriented programming 缩写 POP. 分析出解决问题所需要的步骤,然后把步骤一步一步实现. 面向过程直接关注流程. ...

  9. python类包含对象的个数_python类与对象各个算数运算魔法方法总结

    1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...

  10. 给Python的类和对象动态增加属性和方法

    通常我们会将编程语言分为静态和动态.静态语言的变量是在内存中的有类型的且不可变化的,除非强制转换它的类型:动态语言的变量是指向内存中的标签或者名称,其类型在代码运行过程中会根据实际的值而定.Pytho ...

最新文章

  1. Delphi与Ole,Word,Excel,查找与替换等
  2. Unity3D GUI学习之GUILayout控件及使用
  3. 《linux下sudo服务的使用》RHEL6
  4. h5页面禁止复制_H5移动端页面禁止复制技巧
  5. 吴恩达深度学习 —— 2.15 python中的广播
  6. java 中方法的使用,两个实例教你学会java中方法的使用
  7. 论文阅读-语义分割(2021)-BiSeNetV3:重新思考用于实时语义分割的BiSeNet模型
  8. Selenium2 + Python3.6实战(五):生成HTML测试报告 Invalid argument
  9. 真正的黑科技,完美分离人声伴奏~
  10. r5驱动 索尼exmor_卡片机“X”档案 ——索尼Exmor R CMOS技术解析
  11. 移动硬盘/U盘上装Windows 7旗舰版(VHD版)
  12. word文件做一半未响应_Word经常出现未响应怎么办?
  13. 天下武功唯快不破,实时分析让企业决策又快又准
  14. BitLocker加密怎么解除?
  15. 支付宝与微信对账文件解析
  16. Single Round Match 506 Round 1 - Division I, Level Two SlimeXGrandSlimeAuto
  17. Nginx启动报错:error while loading shared libraries: libpcre.so.1
  18. Luogu P1860 新魔法药水
  19. Vpython 下载与引用
  20. 15哈夫曼树/哈夫曼编码

热门文章

  1. hourglass pytorch 实现
  2. 计算机鼠标不灵活怎么办,鼠标左键不灵敏,教您鼠标左键不灵敏怎么办
  3. Java中不同时区时间的转换
  4. 解决JSONNull导致的JSONObject序列化问题
  5. [转]TIF图像数据结构之研究
  6. 苹果手机里微信数据删除怎么恢复?
  7. lol1.7更新服务器维护,lol12月20日维护公告 v3.0.7.1版本更新内容一览
  8. 【暴躁版】Java如何用IO流读取一个文本,按行输出到控制台?
  9. 方舟服务器商店系统怎么弄,方舟生存进化怎么设置商店系统
  10. 力扣 2104. 子数组范围和