- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我使用方法解析顺序 (MRO) 时,输出会有所不同。任何人都可以解释为什么结果会有所不同。
class A:
def __init__(self):
pass
def abc(self):
print("A")
class B(A):
def __init__(self):
pass
def abc(self):
super().abc()
print("B")
class C(A):
def __init__(self):
pass
def abc(self):
super().abc()
print("C")
class D(B,C):
def __init__(self):
super().abc()
print("D")
obj=D()
Output:
A
C
B
D
//Using Method Resolution Order (MRO):
print(D.__mro__)
Output:(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
最佳答案
您的输出正好相反,因为您在后序
中遍历了继承树。您首先遍历层次结构,然后打印出语句。你需要改变这种行为。先打印(访问节点)再遍历层级。
1. Loop:
|
+--1.1. Traversal (go hierarchy up)
|
+--1.2. Output (print)
你必须先打印语句然后遍历层次结构:
1. Loop:
|
+--1.1. Output (print)
|
+--1.2. Traversal (go hierarchy up)
更改打印顺序:
class A:
def __init__(self):
pass
def abc(self):
print("A")
class B(A):
def __init__(self):
pass
def abc(self):
print("B")
super().abc()
class C(A):
def __init__(self):
pass
def abc(self):
print("C")
super().abc()
class D(B,C):
def __init__(self):
print("D")
super().abc()
obj=D()
Output:
D
B
C
A
关于Python OOP 继承 : Method Resolution Order (MRO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32944357/
在 Python 中的大多数类型/类中,我可以调用不带参数的 .mro()。但不是 type 及其后代: In [32]: type(4).mro() Out[32]: [int, object] I
在 django.utils.functional.py : for t in type(res).mro(): # >> class A(object): pass ... >>> A.__mro
假设我们正在实现一个元类,它需要在类被实例化之前知道方法解析顺序。 class Meta(type): def __new__(cls, name, bases, namespace):
为什么搜索完B之后不去更深的搜索Y OR z而是去搜索A呢? Y 是 A 的父级,如果应该先搜索 A,但是 Y 是 B 的父级所以它应该先搜索 Y,为什么这不会抛出 MRO 错误? 谁能解释一下这个查
class First(object): def __init__(self): print("first") class Second(First): def __i
Python in a Nutshell (2nd Edition)一书中有一个例子,它使用 旧样式类,用于演示如何以经典解析顺序解析方法和 新订单有什么不同。 我通过用新样式重写示例来尝试相同的示例
mro() 是什么意思?怎么办? 示例来自 django.utils.functional : for t in type(res).mro(): # >> class A(object): pas
class parent: def fun1(self): print("foo") fun2 = fun1 class child(parent): def
我将如何创建一个由多个基类/mixin 组成的类的扁平表示。有做这种事的图书馆吗?例如: class Foo(object): def a(self): return clas
我有这段代码,其中使用了超继承和多重继承。类的结果是: go A go! go C go! go B go! go D go! 虽然我希望: go A go! go B go! go D go! 根据
问题描述:我有一个类 C 继承自 mixin A 和 B。我想要一个新类 C_,它具有类 C 中定义的所有方法/属性,但 B 与 B_ mixin,选择了 B_ 的定义。 目前它有效,但我觉得:“祈祷
我发现自己处于一种不寻常的情况,我需要在运行时更改类的 MRO。 代码: class A(object): def __init__(self): print self.__c
这个问题在这里已经有了答案: Why is this an ambiguous MRO? (3 个回答) 关闭4年前。 这是我计划用于我的游戏的代码,但它提示 MRO 错误: class Player
我试图了解 abc.ABCMeta 的方法寄存器的用处。据我了解,阅读https://docs.python.org/3/library/abc.html后: 以下代码: class MyFoo(Co
我找到了一个多重继承的示例,但不明白它的行为方式。 class Printable: """A mixin class for creating a __str__ method that p
通过 add_to_class() 添加字段时,我的模型继承存在问题。 我有一个模型 File(models.Model)和 Image(File) - 这些来自 django-filer。 在我的应
在关于 Python webpage 的文档中python 中经典类的方法解析顺序被描述为深度优先的从左到右搜索。我试图用这段代码对此进行测试: class A(object): def __init
我是 MRO 的新手,在弄清楚这些输出的逻辑时遇到了问题。 情况1: class A(object): def save(self): print "A" class B(A):
class Base(object): def m(self): print 'base' class MixinA(Base): def m(self):
当我使用 __metaclass__ = abc.ABCMeta 时,我偶然发现了这个额外的、没有下划线的 mro 方法。它似乎与 __mro__ 相同,只是它返回的是列表而不是元组。这是一个随机示例
我是一名优秀的程序员,十分优秀!