当前位置: 首页 > 网络应用技术

Python可以继承多少次

时间:2023-03-06 13:14:04 网络应用技术

  简介:今天,首席主席团将与您分享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继承的所有内容。我希望这对每个人都会有所帮助。如果您仍然想了解有关此信息的更多信息,请记住收集并关注此网站。