让我们来谈谈一些听起来很复杂的事情｡
它被称为MRO或方法解析顺序｡
这是什么意思呢？
我这里有个例子给你看｡
假设我们有一个a的类B的类从A的类继承什么都不做.
然后我们还有类C, 它从A继承, 最后是类D, 它从B和C继承.
所以我们有两个类, 它们什么都不做, 然后是类A和类C, 它们有相同的类对象属性｡
我已经画出了这段关系的样子｡
您可以看到D具有来自B和C的多个继承, 而B和C则继承自A｡
Amro或方法解析顺序是Python遵循的一个规则, 当你运行一个方法时, 当你有如此复杂的继承结构时,
它决定运行哪一个方法｡
Amro是一条规则, 它说, 嘿, 做这个, 做这个, 然后做那个｡
这就是您应该运行的方法｡
让我来告诉你我的意思｡
假设我想打印dx点num｡
你觉得这里会发生什么？
让我把它移走或者注释掉｡
如果我运行这个, 你能猜到会发生什么吗？
如果我单击“运行”｡
我也有份？
这是你所期望的吗？
让我们看看这个｡
DD从B和C继承｡
然后那些继承我｡
所以我们得到一个, 因为MRO, 方法的分解顺序不是D, b, a｡
而是d｡
B.最后
C. C.
答｡
嗯嗯嗯
让我们再仔细想想｡
米罗只是简单地说, 如果类､ 方法､ 变量或属性之间的事情是共同的, 那么什么是第一位的？
我该选什么呢？
有一个很好的方法来检验它, 米罗, 然后像这样运行它｡
假湖跑｡
你看那个｡
这是这个班的Maro的命令｡
它说, 嘿, 我要先过牌D｡
如果你调用, 我们就说D. name或d. num｡
我先检查主点D｡
我先检查这个类, 然后检查主点B, 我先检查B,
然后检查C
然后我要过牌｡
最后, 我将再次检查基类对象｡
我们以前见过｡
它是Python中所有对象继承的基类｡
这就是它要检查的顺序｡
现在, 如果我们通过所有这些｡
然后单击“Run（运行）”｡
我去透透气｡
D没有属性number, 因为它遍历了所有这些路径, 甚至检查了基对象, 也没有找到num｡
如果我做一些像SW tr｡
如果我单击“运行”｡
这是因为它会一直通过继承链, 然后到达基底物件｡
基本对象实际上有这个所以它不会出错｡
是的, 你可以用邓德弦｡
现在就去
我在这里找到了一个很好的例子, 向你展示为什么遗产会让人困惑,
以及为什么像阿姆罗这样的事情你可能想要避免或至少要有意识｡
让我们复制这段代码｡
我们把这些都去掉｡
我们要玩个小游戏｡
现在这个语法｡
看起来像这样｡
这就是我们刚刚创建的继承模型｡
看起来很混乱, 不是吗？
所以如果我们在这里做｡
并且我们检查M的MRO或方法分解顺序｡
你觉得会是什么顺序？
在此暂停视频, 试着猜测顺序｡
准备好了
让我们来做米点阿姆罗｡
顺便说一句, 另一种方法是用dunder amro打印机打印出来｡
好吧, 让我们检查一下｡
所以我们首先要做的就是他们｡
好吗？
我们检查他, 然后我们检查B, 我们检查B, 好的｡
然后我们检查A｡
我们在这里检查A, 然后在这里检查x, x, 然后是y｡
然后是Z, 然后是类对象｡
你是这么猜的吗？
让我们看看代码｡
为什么要下这个命令？
顺序取决于我们传递参数的方式, 你可以看到be在A和Z之前传递.
所以这意味着Maro的阶是那么a｡
但比娜之后坚持住｡
那是什么声音？
在B和A之后, 我们有x类｡
为什么X出现在Z之前？
所以, 我们不去Z, 让我们把它做得更大一些｡
它不是去我们认为应该是Z的地方, 而是去X, 然后是Y, 然后是Z, 然后是物体｡
这是因为他们使用的算法, 做米罗, 这是所谓的深度搜索｡
这已经超出了本课程的范围, 但正如你所看到的, 这有点令人困惑｡
事实上, Python实际上改变了MISO规则, 而不是我们以前在Python的较新版本中使用的规则｡
所以这是另一个更新的东西｡
但我给你看这个的原因是因为你永远不会在这个东西上做测试｡
如果你写的代码中继承看起来像这样, 我认为你写的代码很糟糕, 因为这太复杂了｡
我们甚至还没有在这些类中编写任何代码, 这已经很混乱了｡
所以Amro是一种定义继承顺序的方法.
您可以随时使用MRO函数或DUNDAR来检查这一点｡
但我把它带到这里来的原因不只是想让你困惑｡
原因是它存在｡
但是, 您不应该以这种方式来组织程式码｡
这并不意味着这种情况不会在野外发生｡
是的, 的确如此｡
但至少当您看到这样的问题时, 您有一种检查和调试代码的方法｡
我会给你留下一个关于Maro的资源｡
如果你真的很好奇, 你真的想了解这个算法是如何工作的, 以及这个顺序是如何确定的｡
但关键的一点是, 这是Python工作的方式, 用来确定, 嘿,
什么时候调用一个方法或属性｡
这就是我如何查找继承的层次结构｡
好吧, 我会的
如果你的大脑受伤了, 别担心｡
我的也是｡
休息一下, 我们在下一个视频中再见｡
再见, 再见, 再见