- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题描述:我有一个类 C
继承自 mixin A
和 B
。我想要一个新类 C_
,它具有类 C
中定义的所有方法/属性,但 B
与 B_< 交换
(相同的 API)在继承方案中(一种可能的用法是简单的模拟)。 所有类都是新样式类。
我通过打乱继承顺序得到了我想要的东西,因此 MRO:
A B B_ B_ A B
\ / / \ \ /
C / \ C
\ / \ /
C1 C2
C1(C,B_) C2(B_,C)
C1.__mro__ = (C1, C , A, B, B_, object)
C2.__mro__ = (C2, B_, C, A, B , object)
C2
方法(在 C
类之前继承修改后的 mixin)工作没有太多惊喜,如果我调用 B
中定义的方法> mixin,选择了 B_
的定义。
目前它有效,但我觉得:“祈祷吧,我希望不会出现特殊情况并破坏系统!”
问题是:这是解决问题的一种最终不会错的方法还是有更好的方法?
PS:我想我可以用我的火箭筒创建一个元类来重新定义 mro ( as said in the official doc ),但我的直觉告诉我它不一定会更漂亮。
最佳答案
您的方法应该可以正常工作。使用子类来控制 MRO 并将一个类与另一个类进行映射是合法的。
这篇博文给出了几个例子:https://rhettinger.wordpress.com/2011/05/26/super-considered-super/
关于python - 可以使用 MRO 来覆盖混入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266720/
在 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__ 相同,只是它返回的是列表而不是元组。这是一个随机示例
我是一名优秀的程序员,十分优秀!