博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解Python中的__init__和__new__
阅读量:5303 次
发布时间:2019-06-14

本文共 1194 字,大约阅读时间需要 3 分钟。

先来看一段代码:

class A(object):  # -> don't forget the object specified as base    def __new__(cls):        print ("A. __new__ called")        return super().__new__(cls)    def __init__(self):        print ("A. __init__ called")A()

输出结果:

A. __new__ calledA. __init__ called
  1. 执行的顺序是先__new____init__。因为函数__new__在我们调用类的时候会被自动调用,并且返回 instance__init__,也就是__init__中的 self

再来看一段代码:

class A(object):    def __new__(cls):        print ("A.__new__ called")    def __init__(self):        print ("A.__init__ called")  # -> is actually never calledprint (A())

输出结果:

A.__new__ calledNone

这里__init__并没有被调用。这是因为与之前不同,这次__new__ override 了父类的__new__之后,没有使用super()继承父类其他创建 instancemethod ,只是单纯的执行打印。所以并没有返回一个 instance__init__self。所以返回None

再来看如果在__new__中加入return功能会如何:

class A(object):    def __new__(cls):        print ("A. __new__ was called")        return 29print (A())

输出结果是:

A.__new__ called29

得用__new__函数,我们可以在创建类的 instance 的时候返回其他类型的 instance

class Sample(object):    def __str__(self):        return "A returned an instance of Sample()"class A(object):    def __new__(cls):        return Sample()print (A())

输出结果:

A returned an instance of Sample()

转载于:https://www.cnblogs.com/yaos/p/7072658.html

你可能感兴趣的文章
第0次作业
查看>>
mongodb的学习 (1)
查看>>
RHCS
查看>>
bash-逻辑控制----if语句
查看>>
【译】Visual Studio 15 预览版更新说明
查看>>
压缩传感--正交变换
查看>>
CSS3 加载进度样式
查看>>
函数进阶
查看>>
CentOS系统 cd命令的使用
查看>>
类级的重构
查看>>
JS实战技巧
查看>>
《深入浅出wpf》第五章 控件与布局
查看>>
H5定位
查看>>
CopyOnWrite容器
查看>>
分享——正则表达式表
查看>>
Linux常用命令大全(非常全!!!)
查看>>
T-SQL基础(一)之简单查询
查看>>
1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写
查看>>
验证二叉搜索树
查看>>
关注产品和项目开发中的反模式(转)
查看>>