简介:今天,首席主席团将与您分享Python继承可以继承多少次。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
本文目录清单:
1. Python中的多重继承2. Python的多重继承3.来寻求帮助6。Python可以继承更多的继承:派生类只有一个基类
多重继承:有多个派生类的基类
一个句子中的区别是:单一继承是一种生命,而更多的继承是另一种生命
基本的语法继承:
当子类定义构造函数时,需要调用父级结构方法一次。
案例演示:
在多个继承中,所有基类的方法都可以直接继承,但是需要手工初始化属性。如果派生类中没有__init__方法,则默认情况下,第一类的属性。是__INIT __方法在派生类中,将不会获得所有基类的属性,并且需要手动初始化。
我们定义了ChineSestudent类,其继承关系如下:
调用基类的属性和方法
在不同的基类中也有相同的方法。当调用派生对象时,将调用哪个父类?
默认情况下,如果多个基类中存在相同的方法,则越高,优先级就越高。
为了避免后期不必要的错误,建议应尽可能避免基础类的属性和方法。
MRO(方法解决顺序)方法解析顺序
如果是经典类(旧类型),则是MM的方法
如果是新类,则MRO的Method-BFS(广度优先搜索)策略
楼上的答案非常正确。简单的术语:当D类实例化时,您可以按顺序初始化C类和A类。因此
实际上,无需在子类别中初始化父类。当您实例化时,您将被创建
A类(对象):
def __init __(自我):
self.A = 1
B级(A):
def __init __(自我):
self.A = 2
self.b = 2
C类(B,A):
经过
C = C()
C.A
2
此外,添加它。在新类的情况下,继承顺序是影响的。在继承顺序中,经典类是最优先的,并且首选新类型。如果两者混合在一起,它将在几分钟之内头晕。您可以进行更多的实验并理解。
猜猜您想询问属性搜索规则的数量以获取更多继承
Python类是多个继承。
在python2中:
Python的类别分为经典和新类型(明确继承的对象),分别对应于深度优先级和广度优先级规则
在python3中:
默认值是一种新类型,通常广度是优先搜索
在对Python类的多重继承的深入分析中
首先要解释的是,Python的类别分为经典和新类别
经典课程是Python2.2之前的东西,但它仍然兼容2.7,但3个版本仅识别新类型
新类型可以在Python2.2的版本中使用
经典类型之间的区别是:
经典类并非来自特定的基类,新类是从对象的基类得出的:
代码显示如下:
# 老式
A级():通过
# 新风格
A类(OBEJCT):通过
2.当经典类通过多个继承继承时,匹配从左到右的深度优先级原理的方法。新类型与C3算法匹配(与广度优先级不同)
3.经典课程没有__mro__和instance.mro()呼叫,并且可以使用新类型。
为什么不需要经典班,您需要将其替换为新课程
因为经典类别中的多个继承会遇到一些问题……这可能会导致父类在继承树中查询:
代码显示如下:
A级():
def foo1(self):
打印“ A”
B级(A):
def foo2(self):
经过
C级(A):
def foo1(self):
打印“ C”
D类(B,C):
经过
d = d()
d.foo1()
根据从左到右的经典搜索顺序的规则,当访问d.foo1()时,没有人..然后找到它,找到B,没有,深度优先级,请访问A.,找到foo1(),所以此时,此时召集了一个foo1(),这导致c re written foo1()绕过它。
因此,Python介绍了新类型的概念,并且从对象和他的匹配规则继承的每个基类也从深度更改为C3
C3算法
C3算法如何匹配?在讨论问题和答案部分之后,以下内容如下:
C3算法的核心之一是合并。
在合并列表中,如果第一序列的第一类MRO出现在其他序列中,并且是第一个或没有其他序列,则此类将从这些序列中删除,并且访问序列的访问顺序将相信
例如:(在问题@zhuangzebo中引用Zhuangzebo的问题)
代码显示如下:
A级(O):通过
B级(O):通过
C级(O):通过
D类(A,B):通过
E级(C,D):通过
首先,您需要知道o(object)mro(方法解析订单)列表为[o,]
然后下一步是:
代码显示如下:
先生(a)= [a,o]
la(b)= [b,o]
la(c)= [C,O]
mro(d)= [d] + merge(mro(a),mro(b),[a,b])
= [d] + merge([a,o],[b,o],[a,b])
= [d,a] + merge([o],[b,o],[b])
= [d,a,b] + merge([o],[o])
= [D,A,B,O]
mro(e)= [e] + merge(mro(c),mro(d),[c,d])
= [E] + Merge([C,O],[D,A,B,O],[C,D])
= [e,c] + merge([o],[d,a,b,o],[d])
= [e,c,d] + merge([o],[a,b,o])
= [E,C,D,A,B] + Merge([O],[O])
= [E,C,D,A,B,O]
然后有一个特殊的情况:
例如:
合并(do,co,c)首先合并为d
合并(do,co,c)首先合并为c
这意味着。当有两个序列中出现的类(例如C)中时,当情况同时出现时(例如D)以一个序列的顺序出现时,这种情况就会匹配。
新类生成的访问顺序存储在仅阅读列表的列表中。
您可以使用实例.__ mro__或instance.mro()访问
最后一场比赛按MRO序列的顺序匹配
C3和广度优先级之间的区别:
例如,我将完全理解:
代码显示如下:
A类(对象):通过
B级(A):通过
C级(B):通过
D级(A):通过
E级(D):通过
F级(C,E):通过
根据广度优先级进行遍历,F的MRO序列应为[F,C,E,B,B,D,A]
但是C3是[F,E,D,C,B,A,A]
这意味着您可以用作C3与一个链接上的另一个链接的交叉点,然后深入遍历另一个链接。
新类型以及经典的超级和经典访问问题
在经典类别中,如果您想访问父班,可以使用类名称访问...
代码显示如下:
A级():
def __init __(自我):
打印“ A”
B级(A):
def __init __(自我):
打印“ B”
a .__ init __(self)#python默认情况下不会调用父类的初始化功能
没有这样的问题,但是如果类的继承结构更加复杂,那么代码的维护将很差。
因此,新课程推出了超级...
代码显示如下:
A级():
def __init __(自我):
打印“ A”
B级(A):
def __init __(自我):
打印“ B”
super(b,self).__ init __()
目前,还有另一个问题:当课程是多重继承时,超级访谈是哪个类别?
SUPER实际上确定__MRO__序列访问哪个类...实际上,这是一种以后在__Mro__中在__mro__中调用类的方法。
例如,序列为[F,E,D,C,B,A]
超级和由班级名称混合使用的坑
代码显示如下:
A类(对象):
def __init __(自我):
打印“输入”
打印“离开”
B类(对象):
def __init __(自我):
打印“ Enter B”
打印“离开B”
C级(A):
def __init __(自我):
打印“ Enter C”
super(c,self).__ init __()
打印“离开C”
D级(A):
def __init __(自我):
打印“ Enter D”
super(d,self).__ init __()
打印“离开D”
E级(B,C):
def __init __(自我):
打印“ Enter E”
b。__ init __(自我)
c .__ init __(自我)
打印“离开E”
F级(E,D):
def __init __(自我):
打印“ Enter F”
e .__ init __(自我)
d .__ init __(自我)
打印“离开F”
此时打印:
代码显示如下:
输入f
输入e
输入b
离开b
输入c
输入d
进入一个
给一个
离开d
离开c
离开e
输入d
进入一个
给一个
离开d
离开f
可以看出,D和A的初始化函数两次是混乱的!
根据班级名称访问等同于c语言之前的goto语句...跳跃凌乱,然后使用超级访问。
因此,建议您始终使用Super或始终使用班级名称访问
最佳实施:
避免多重继承
超级使用一致
不要混合经典和新类别
打电话给父班时,请注意检查班级
以上是我对Python类的继承的理解。我希望这对每个人都会有所帮助
9.5.1。继承
Python也仅限于支持多种继承形式。多重继承的定义如下:
类derivedClassName(Base1,base2,base3):
在大多数情况下,在最简单的情况下,您可以想到的搜索属性是从父类的继承,向右向右的,而不是在同一类结构中搜索两次,因此有一个重叠。,如果在derivedClassName中找不到属性(示例中的派生类),则您将搜索base1,然后(递归)搜索其基类。如果最终找不到它,请搜索base2,依此类推。
实际上,Super()可以动态地更改分析顺序。该方法可以在其他某些多雌遗言语言中看到,类似于呼叫next-amthod,该语言比继承语言中的Super更强大。
动态调整的顺序非常必要,因为所有更多继承都将具有一个或多个钻石形状的关系(参考至少一个祖先类,可以通过多个继承路径到达)。例如,所有新样式类都从对象继承了,因此任何其他继承将始终达到对象。
为了防止通过动态线性算法重复访问基类,每个类都指定从左到右的顺序。每个祖先类仅被调用一次。它不会影响其祖先的顺序)。从本文中,可以以这种方式设计可靠且可扩展的多重继承类。有关更多内容,请参阅。
python支持多个继承,并且C ++:继承子类继承同一父类的多个父类将存在一个问题。目前,父构建体方法可以被多次调用。对此问题,我找到了一些信息,尽管我自己没有验证自己。在这里,我总结了我对此问题的看法。
Python和C ++对此问题有不同的解决方案。当然,Python也取决于其版本。
C ++使用的解决方案是引入虚拟继承的语法,以避免同一类被构造多次。
Python的方法是MRO(方法解决顺序,方法分析订单)。在Python2.3之前,MRO的实现基于DFS,而Python2.3之后的MRO实施基于C3 algorithm。找到的信息解释了更换的原因。算法:
为什么使用C3算法
C3算法首先是针对LISP提出的。它在Python中应用于解决一个问题,即基于深度优先级,原始搜索算法对局部优先级和单调性不满意。
本地优先级:指声时,请参考父级的顺序,例如c(a,b)。如果访问C类C对象属性,则应首先找到A类,然后找到类。
单调性:如果在C的分析顺序中,A位于B的前面,则在C中的所有子类中,它也必须满足此顺序。
----------------------------------------------------------------------------------------------------------------
在新类中,当找到要调用的函数或属性时,首选宽度。
在旧类型中,深度搜索。
结论:以上是首席CTO注释给所有人介绍的Python继承的所有内容。我希望这对每个人都会有所帮助。如果您仍然想了解有关此信息的更多信息,请记住收集并关注此网站。