Python魔法方法(一):构造与析构——__init__,__new__,__del_____new__ return-程序员宅基地

技术标签: python  Python  

看了小甲鱼的Python教程视屏后做的一些总结

init(self)

构造方法之一,用于初始化实例对象,在创建实例对象时将自动调用,可根据具体需求设置实例对象的一些属性:

class Ball:
   def __init__(self, name):
       self.name = name
   def call(self):
       print('我叫%s' % self.name)
a = Ball('球A')
a.call()

输出结果为:
‘我叫球A’
init(self)不能有返回值

new(cls[,…])

真正创建实例对象的方法,创建实例对象时将首先调用此方法进行实例对象的创建,然后再调用__init__方法对实例对象进行初始化。Object类中已对其进行了定义,它将通过一系列封装起来的操作完成对象的创建。
__new__方法一般不重写,如果单纯地对其重写:

class A:
   def __new__(cls):
       print('__new__方法被调用')
   def __init__(self):
       print('self方法被调用')
aaa = A()

此时,__init__将不被调用,仅输出 ‘__new__方法被调用’,而且实例对象aa也不存在(输入print(aa)将得到None)。
这是因为定义__new__方法时对A的父类Object中的__new__方法进行了重写,原有的用于创建实例对象的代码被覆盖,导致未能创建实例对象。
所以重写__new__方法通常会在返回值里调用其父类的__new__来保证实例对象的成功创建:

class A:
   def __new__(cls):
       print('__new__方法被调用')
       return super().__new__(cls)
   def __init__(self):
       print('self方法被调用')
aa = A()

new(cls[,…])中的cls默认指代当前类,它将创建cls类型的实例对象,而此实例对象将作为self传给__init__,也就是说,__new__创建的实例对象就是__init__的第一个参数self
__new__中cls后的参数也将作为__init__中self后的参数传入。但如果__new__创建的实例对象的类型不属于当前类,则当前类的__init__方法不会被调用:

class A:
   def __new__(cls):
       print('A--->New')
       return super().__new__(A)
   def __init__(self):
       print('A--->Init')
class B:
   def __new__(cls):
       print('B--->New')
       return super().__new__(A)
   def __init__(self):
       print('B--->Init')
aa = A()
bb = B()     

输出结果为:
A—>New
A—>Init
B—>New
A—>New
这里A的__new__方法返回了A类型的实例对象,所以A的__init__方法被调用,而B的__new__方法返回的为A类型的对象,所以B的__init__对象没有被调用(使用type(bb)可发现bb的类型为A),这里将return super().__new__(A)换为return super().__new__(cls)将可调用B的__init__方法

__new__方法中cls后的参数会自动传给__init__方法,如下:

class A:
    def __new__(cls, string):
        return super().__new__(cls, string)
   
   def __init__(self, string):
       print(string)
aaa = A('I love China!')

将输出 ‘I love China!’

一般很少重写__new__方法,但如果继承了一不可变类型(如字符串)却需要进行修改,则需重写,如下(小甲鱼课上举的例子):

class CapStr(str):
   def __new__(cls, string)
       string = string.upper()
       return str.__new__(cls,string)
a = CapStr('I love China')

这里将输出’I LOVE CHINA’,
即先将字符串改为大写,然后将修改后的字符串作为str__new__方法的一个参数传入,由str的__new__方法创建一个字符串类型的实例对象,所以使用type(a)查看实例对象a的类型可以发现a的类型为str(字符串)
这也是__new__方法的作用之一,即对一些不可变类型在其未被创建时做出需要的修改

del(self)

析构器,当一个对象要被销毁时会自动调用__del__(self),但del x并不等于自动调用x.__del__(),即当垃圾回收机制认定对象无用将要回收时,才会自动调用__del__(self)(当del删除了一个对象的所有引用,将自动启动__del__(self))

class A:
   def __del__(self):
       print('A--->Del')
a1 = A()
a2 = A()
a3 = A()
del a1
del a2
del a3      # 仅在此句被执行后打印'A--->Del'
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ForTheEnd/article/details/107412274

智能推荐

Tensorflow serving keras转哦--- 一键部署和并发测试进阶记录_tensorflow-serving:1.14 grpc protobuf-程序员宅基地

文章浏览阅读1.1k次。实现一键布署:1.一键安装全部环境,上一篇文章说了基本的操作 《keras模型的布署在Tensorflow serving — 基础记录》,那么我们是否要手把手自己去安装呢?如果对方使用你的东西,但是不是很熟悉我们是否可以辅助安装,是肯定的,我们可以写一个sh文件,也就是.sh脚本文件参考链接1参考链接22.docker-compse 一键部署:tensorflow-serving和we..._tensorflow-serving:1.14 grpc protobuf

数据结构与算法——图的邻接表表示法类的C++实现_图的邻接表表示法c++实现-程序员宅基地

文章浏览阅读8k次,点赞4次,收藏25次。数据结构与算法——图的邻接表表示法类的C++实现_图的邻接表表示法c++实现

盘点那些国际知名黑客(上篇)_国外顶级黑客-程序员宅基地

文章浏览阅读34次。现在国家很重视网络安全建设,网络安全已经成为了很多高校的一级学科,因此通过正常学习即可进入网络安全行业,大家一定要遵纪守法,效仿黑客们的行为做一些非法的黑客攻击行为,下期我们将继续为大家送上其他几位世界著名黑客的传奇故事,请大家保持关注哦。_国外顶级黑客

i2c 驱动工作_i2c burst write-程序员宅基地

文章浏览阅读884次。在新版芯片(fpga)上写驱动:1. 新版sx_i2c burst write

今日头条的核心架构解析-程序员宅基地

文章浏览阅读84次。今日头条创立于2012年3月,到目前仅4年时间。从十几个工程师开始研发,到上百人,再到200余人。产品线由内涵段子,到今日头条,今日特卖,今日电影等产品线。一、产品背景今日头条是为用户提供个性化资讯客户端。下面就和大家分享一下当前今日头条的数据(据内部与公开数据综合):5亿注册用户2014年5月1.5亿,2015年5月3亿,2016年5月份为5亿。几乎..._用今日头条的实战复盘,教你大厂都在用的「信息降噪」方

boost regex 正则表达式使用学习_eeexfindregexboost-程序员宅基地

文章浏览阅读7.3k次。什么是正则表达式?正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。如果您不知道什么是正则表达式,请看这篇文章http://blog.csdn.net/begtostudy/archive/2007/11/11/1879206.aspx有了正则表达式的基础,问题是如何使用。我们以boost::regex来说先看一个网上经典的例子。#i_eeexfindregexboost

随便推点

32位单精度浮点数到8位十六进制数的转换(excel vba code for float to hex)_excel浮点数转为十六进制-程序员宅基地

文章浏览阅读6k次。  最近有个需求,需要将32位单精度十进制浮点数转换为其对应的内存中存储形式(IEEE-754标准)的8个十六进制字符串。此时的情景是数据量有点大并且需要记录在excel文件中。当在一个单元格中输入单精度浮点数时,在相应的单元格中自动生成8个十六进制字符串。别人推荐用EXCEL VBA来编程解决。  下面32位单精度十进制浮点数转换为其对应的内存中存储形式(IEEE-754标准)的8个十六进制字..._excel浮点数转为十六进制

vivo支持鸿蒙系统吗,什么手机可以刷鸿蒙系统?vivo、OPPO、三星手机刷鸿蒙系统教程...-程序员宅基地

文章浏览阅读2.2w次。华为全新鸿蒙系统发布之后,除了不少的华为手机可以升级尝鲜之外,很多小伙伴还是很羡慕的,比如,小米,红米,vivo、OPPO、三星,魅族等手机用户都想升级刷鸿蒙系统,那么这个该怎么操作呢?可以升级吗?下面一起来看看。什么手机可以刷鸿蒙系统?其实大部分的系统都是可以私自去刷的,但是鸿蒙能不能刷不一定。就比如现阶段,能使用的只有华为手机,如果你是刷的鸿蒙系统,那这种永远不是官方授权的会有很大概率出现死机..._vivo的手机可以安装color os吗

spring boot之spring mvc常用配置--@controllerAdvice(5)_controlleradvice mvc配置-程序员宅基地

文章浏览阅读1.3k次。@controllerAdvice:我们可以将对于使用@Controller注解的控制器的全局配置放在同一个位置。对于注解了@Controller的类,该类下可以使用@ExceptionHandler、@InitBinder、@modelAttribute。@RequestMapping的控制器内的方法也是有效的。而使用@controllerAdvice(控制器通知)注解后。这些@Exce_controlleradvice mvc配置

Qt自动同步时间_ntp qt-程序员宅基地

文章浏览阅读1.9k次。Qt自动同步时间Qt自动同步时间需要使用网络时间协议(Network Time Protoco, NTP)。首先需要include一个NTP的库#include <QUdpSocket>然后在头文件声明signals: void connected(); void readyRead();public slots: void setNtp(); void connectsucess(); void readingDataGrams();_ntp qt

DefaultTableModel设置可选中但不可编辑_defaulttablemodel 值不可编辑-程序员宅基地

文章浏览阅读1.9k次。要想设置DefaultTableModel设置可选中但不可编辑,必须重写isCellEditable方法,把true改为false;代码如下:/*** 重写方法*/tableModel = new DefaultTableModel(action.findCharge(), action.head){public boolean isCellEditable(int ..._defaulttablemodel 值不可编辑

MySQL Cluster管理节点配置文件-数据节点4G内存_ndb cluster 需要多大内存-程序员宅基地

文章浏览阅读1w次。自己测试机器上搭建使用,大家可以参考一下[NDBD DEFAULT]#TotalSendBufferMemory = 256MNoOfReplicas=2DataMemory=2500MIndexMemory=256MDataDir=/var/lib/mysql-cluster#FileSystemPath=/data/dbdata#Redo logFragmentLo..._ndb cluster 需要多大内存