鱼C论坛

 找回密码
 立即注册
查看: 2532|回复: 3

[已解决]关于new方法提问

[复制链接]
发表于 2023-1-29 22:11:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
家人们问一下谁能跟我讲解一下下面这个代码:
class A():
    def __init__(self):
        print("A init")

        
class B(A):
    def __new__(self):
        print("B new")
    def __init__(self):
        print("B init")

        
class C(B):
    def __init__(self):
        print("C init")
def main():
    a=A()
    b=B()
    c=C()
main()


这个代码的逻辑是怎么回事啊,为什么我完全看不懂它输出的结果
拜托了谢谢家人们谢谢大佬们
最佳答案
2023-1-29 22:24:56
一个类在实例化的时候先调用 __new__ 返回一个实例化对象,然后再调用实例化对象的 __init__

a = A() 相当于 a = A.__new__(A); a.__init__()
b = B() 相当于 b = B.__new__(B); b.__init__()
c = C() 相当于 c = C.__new__(C); c.__init__()

因为你没有重写 A 的 __new__ 方法,所以 A 的 __init__ 方法可以正常调用
而你重写了 B 和 C 的 __new__ 方法,而且你重写的 __new__ 没有返回值(也就是返回None),
所以 b 和 c 实际上是 None 对象,所以调用了 None 的 __init__ 方法,而没有调用 B 和 C 的 __init__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-29 22:24:56 | 显示全部楼层    本楼为最佳答案   
一个类在实例化的时候先调用 __new__ 返回一个实例化对象,然后再调用实例化对象的 __init__

a = A() 相当于 a = A.__new__(A); a.__init__()
b = B() 相当于 b = B.__new__(B); b.__init__()
c = C() 相当于 c = C.__new__(C); c.__init__()

因为你没有重写 A 的 __new__ 方法,所以 A 的 __init__ 方法可以正常调用
而你重写了 B 和 C 的 __new__ 方法,而且你重写的 __new__ 没有返回值(也就是返回None),
所以 b 和 c 实际上是 None 对象,所以调用了 None 的 __init__ 方法,而没有调用 B 和 C 的 __init__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 22:33:40 | 显示全部楼层
isdkz 发表于 2023-1-29 22:24
一个类在实例化的时候先调用 __new__ 返回一个实例化对象,然后再调用实例化对象的 __init__

a = A() 相 ...

讲得好明白!谢谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 23:46:45 | 显示全部楼层
星夕ING 发表于 2023-1-29 22:33
讲得好明白!谢谢您

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 19:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表