看了小甲鱼的Python教程视屏后做的一些总结
构造方法之一,用于初始化实例对象,在创建实例对象时将自动调用,可根据具体需求设置实例对象的一些属性:
class Ball:
def __init__(self, name):
self.name = name
def call(self):
print('我叫%s' % self.name)
a = Ball('球A')
a.call()
输出结果为:
‘我叫球A’
init(self)不能有返回值
真正创建实例对象的方法,创建实例对象时将首先调用此方法进行实例对象的创建,然后再调用__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 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'
文章浏览阅读1.1k次。实现一键布署:1.一键安装全部环境,上一篇文章说了基本的操作 《keras模型的布署在Tensorflow serving — 基础记录》,那么我们是否要手把手自己去安装呢?如果对方使用你的东西,但是不是很熟悉我们是否可以辅助安装,是肯定的,我们可以写一个sh文件,也就是.sh脚本文件参考链接1参考链接22.docker-compse 一键部署:tensorflow-serving和we..._tensorflow-serving:1.14 grpc protobuf
文章浏览阅读8k次,点赞4次,收藏25次。数据结构与算法——图的邻接表表示法类的C++实现_图的邻接表表示法c++实现
文章浏览阅读34次。现在国家很重视网络安全建设,网络安全已经成为了很多高校的一级学科,因此通过正常学习即可进入网络安全行业,大家一定要遵纪守法,效仿黑客们的行为做一些非法的黑客攻击行为,下期我们将继续为大家送上其他几位世界著名黑客的传奇故事,请大家保持关注哦。_国外顶级黑客
文章浏览阅读884次。在新版芯片(fpga)上写驱动:1. 新版sx_i2c burst write
文章浏览阅读84次。今日头条创立于2012年3月,到目前仅4年时间。从十几个工程师开始研发,到上百人,再到200余人。产品线由内涵段子,到今日头条,今日特卖,今日电影等产品线。一、产品背景今日头条是为用户提供个性化资讯客户端。下面就和大家分享一下当前今日头条的数据(据内部与公开数据综合):5亿注册用户2014年5月1.5亿,2015年5月3亿,2016年5月份为5亿。几乎..._用今日头条的实战复盘,教你大厂都在用的「信息降噪」方
文章浏览阅读7.3k次。什么是正则表达式?正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。如果您不知道什么是正则表达式,请看这篇文章http://blog.csdn.net/begtostudy/archive/2007/11/11/1879206.aspx有了正则表达式的基础,问题是如何使用。我们以boost::regex来说先看一个网上经典的例子。#i_eeexfindregexboost
文章浏览阅读6k次。 最近有个需求,需要将32位单精度十进制浮点数转换为其对应的内存中存储形式(IEEE-754标准)的8个十六进制字符串。此时的情景是数据量有点大并且需要记录在excel文件中。当在一个单元格中输入单精度浮点数时,在相应的单元格中自动生成8个十六进制字符串。别人推荐用EXCEL VBA来编程解决。 下面32位单精度十进制浮点数转换为其对应的内存中存储形式(IEEE-754标准)的8个十六进制字..._excel浮点数转为十六进制
文章浏览阅读2.2w次。华为全新鸿蒙系统发布之后,除了不少的华为手机可以升级尝鲜之外,很多小伙伴还是很羡慕的,比如,小米,红米,vivo、OPPO、三星,魅族等手机用户都想升级刷鸿蒙系统,那么这个该怎么操作呢?可以升级吗?下面一起来看看。什么手机可以刷鸿蒙系统?其实大部分的系统都是可以私自去刷的,但是鸿蒙能不能刷不一定。就比如现阶段,能使用的只有华为手机,如果你是刷的鸿蒙系统,那这种永远不是官方授权的会有很大概率出现死机..._vivo的手机可以安装color os吗
文章浏览阅读1.3k次。@controllerAdvice:我们可以将对于使用@Controller注解的控制器的全局配置放在同一个位置。对于注解了@Controller的类,该类下可以使用@ExceptionHandler、@InitBinder、@modelAttribute。@RequestMapping的控制器内的方法也是有效的。而使用@controllerAdvice(控制器通知)注解后。这些@Exce_controlleradvice mvc配置
文章浏览阅读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
文章浏览阅读1.9k次。要想设置DefaultTableModel设置可选中但不可编辑,必须重写isCellEditable方法,把true改为false;代码如下:/*** 重写方法*/tableModel = new DefaultTableModel(action.findCharge(), action.head){public boolean isCellEditable(int ..._defaulttablemodel 值不可编辑
文章浏览阅读1w次。自己测试机器上搭建使用,大家可以参考一下[NDBD DEFAULT]#TotalSendBufferMemory = 256MNoOfReplicas=2DataMemory=2500MIndexMemory=256MDataDir=/var/lib/mysql-cluster#FileSystemPath=/data/dbdata#Redo logFragmentLo..._ndb cluster 需要多大内存