IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python子类实例化的时候父类的__new__会被调用吗? -> 正文阅读

[Python知识库]python子类实例化的时候父类的__new__会被调用吗?

测试代码:

class A:
    def __new__(cls):
        print("testA")
class B(A):
    def __new__(cls):
        print("testB")

class C(B):
    pass

D=C()

测试结果:

testB

这说明子类实例化的时候,会调用父类的__new__方法,但是不会调用祖先的__new__方法。

class A:
    def __new__(cls):
        print("testA")
class B(A):
    pass

class C(B):
    pass

D=C()

测试结果:

testA

这说明,如果父类么有实现__new__方法,那么就会继续沿着继承链往上寻找祖先的__new__方法,一旦找到就立即调用,然后停止寻找。

假设子类实现了__new__方法,那么父类的__new__方法还会被调用吗?

class A:
    def __new__(cls):
        print("testA")
class B(A):
    def __new__(cls):
        print("testB")

class C(B):
    def __new__(cls):
        print("testC")

D=C()

测试结果:

testC

这说明子类实现了__new__方法,那么父类的__new__方法就不会被调用了,python会调用子类的__new__方法。

于是,可以证明在单继承情况下:

python的内置方法的resolution的过程,实际上也是遵循继承关系的,即在子类中找不到的内置方法,就按照__MRO__的顺序去寻找对应的内置方法,然后调用。

上面的测试只是单继承情况,证据还不多,来测试一下多继承的情况。

多继承下的__new__方法是按照继承关系来确定的吗?

class A:
    def __new__(cls):
        print("testA")
class B:
    def __new__(cls):
        print("testB")

class C(A,B):
    def __new__(cls):
        print("testC")

print(C.__mro__)
D=C()

测试结果:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
testC

这个测试代码中,实际上是按照MRO顺序寻找的。

class A:
    def __new__(cls):
        print("testA")
class B:
    def __new__(cls):
        print("testB")

class C(A,B):
    pass

print(C.__mro__)
D=C()

测试结果:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
testA

该例中,也是按照MRO顺序寻找的。

总结:

pyhton子类的__new__方法是按照MRO顺序寻找的,一旦确定__new__,就停止寻找。

其实,python的任何内置方法都是按照MRO顺序寻找的。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:06:21  更:2022-04-29 12:06:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:40:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码