为啥我觉得python好难,有没有python大佬解答一下类和继承的问题,谢谢了

Ironz.R6-avatar

Ironz.R6

2021-02-02T16:25:19+00:00

人工智能相关。无论是pytorch还是tensorflow,在使用子类API构建模型都需要使用“super”,但是super是什么作用我十分迷惑,网上也是五花八门。我举个例子,关于多重继承的。

使用super的类:

class Base(object):
def __init__(self):
print("enter Base")
print("leave Base")


class A(Base):
def __init__(self):
print("enter A")
super(A,self).__init__()
print("leave A")


class B(Base):
def __init__(self):
print("enter B")
super(B,self).__init__()
print("leave B")

class C(A,B):
def __init__(self):
print("enter C")
super(C,self).__init__()
print("leave C")


c=C()

则输出

enter C
enter A
enter B
enter Base
leave Base
leave B
leave A
leave C

但是如果不使用super,

class Base(object):
def __init__(self):
print("enter Base")
print("leave Base")


class A(Base):
def __init__(self):
print("enter A")
Base.__init__(self) #调用父类的构造函数进行初始化
print("leave A")


class B(Base):
def __init__(self):
print("enter B")
Base.__init__(self) #调用父类的构造函数进行初始化
print("leave B")

class C(A,B):
def __init__(self):
print("enter C")
A.__init__(self) #调用父类A的构造函数进行初始化
B.__init__(self) #调用父类B的构造函数进行初始化
print("leave C")


c=C()

则输出

enter C
enter A
enter Base
leave Base
leave A
enter B
enter Base
leave Base
leave B
leave C


为什么一个super,造成了如此大的不同?不是说python是小学生语言吗,我觉得真的不简单啊。。。
Ironz.R6-avatar

Ironz.R6

求助大佬
ALICE ZUBERG-avatar

ALICE ZUBERG

super() 函数是用于调用父类(超类)的一个类。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序
用super的时候实例化了一个super类,不是关键字也不是函数
这个缩进我看了想打人

随便给个例子
[img]https://img.nga.178.com/attachments/mon_202102/08/-7Qbj89-987rK2aT3cSlc-sg.jpg.medium.jpg[/img]
Ironz.R6-avatar

Ironz.R6

[quote][pid=491709303,25464332,1]Reply[/pid] Post by [uid=38658110]管理者埃克索图斯后期型[/uid] (2021-02-08 00:42):

super() 函数是用于调用父类(超类)的一个类。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序
用super的时候实例化了一个super类,不是关键字也不是函数
这个缩进我看了想打人

随便给个例子
[img]https://img.nga.178.com/attachments/mon_202102/08/-7Qbj89-987rK2aT3cSlc-sg.jpg.medium.jpg[/img][/quote]谢谢大佬,收藏了
Nimthedog-avatar

Nimthedog

你这个(Object)就看得人无比难受…
sexipexi-avatar

sexipexi

super函数可以用来调父类方法吧。具体调哪一个父类的方法是根据继承关系和类继承声明的顺序决定的。
你打印 类名.__mro__就能看到 解释器具体会以哪个顺序去找父类的方法。
具体的可以看下流畅的python 第十二章。
我也是现学现卖,写java的[s:ac:哭笑]

我感觉py比java难,这几天看书看得迷迷糊糊的,还是太菜了[s:ac:汗]
🗿Loftedaura007🗿 ®-avatar

🗿Loftedaura007🗿 ®

所以说那些零基础学py的培训都是噶韭菜的。要是学生报名了想学学py语法就还好,要是大龄信了邪去报名,浪费了金钱又浪费了时间,真就是坑死人不偿命了。

那么多基础课程不修,学几句语法就像就业,真是拿衣服
アル-avatar

アル

java里super就是调用父类的方法,py类似?
GreatColt77-avatar

GreatColt77

实质上super只是为了方便你在修改父类的名字的时候不用修改子类的__init__方法里的对应名字,和能够一行就把父类都初始化完毕,因为复杂的时候你可以搞个class X(A, B, C, D)这种出来,如果ABCD有什么共同父类的话使用super也可以避免多次初始化那个共同父类(你后面没用super那个例子就这样了,初始化base两次)
不过个人在实践中也发现python的super的父类排序其实也不是能完全照应到所有情况的,super在你没有搞清楚它的具体行为方式之前直接照用就行了
🗿Loftedaura007🗿 ®-avatar

🗿Loftedaura007🗿 ®

[quote][pid=491709303,25464332,1]Reply[/pid] Post by [uid=38658110]管理者埃克索图斯后期型[/uid] (2021-02-08 00:42):
super() 函数是用于调用父类(超类)的一个类。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序
......[/quote]多重继承的查找算法叫啥名字我给忘了,不过你标示的好像有问题。

第三步执行完了应该直接跳到第六步。没有第四和第五部