- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了一个多重继承的示例,但不明白它的行为方式。
class Printable:
"""A mixin class for creating a __str__ method that prints
a sequence object. Assumes that the type difines __getitem__."""
def lef_bracket(self):
return type(self).__name__ + "["
def right_bracket(self):
return "]"
def __str__(self):
result = self.lef_bracket()
for i in range(len(self)-1):
result += str(self[i]) + ", "
if len(self) > 0:
result += str(self[-1])
return result + self.right_bracket()
此脚本存储在 printable.py 中,因此类 Printable
的使用方式如下:
>>> from printable import *
>>> class MySeq(list, Printable):
... pass
...
>>> my_seq = MySeq([1,2,3])
>>> print(my_seq)
MySeq[1, 2, 3]
我的问题是,为什么__str__
方法继承自Printable
类而不是list
类,而方法解析顺序MySeq
是:
>>> MySeq.__mro__
(<class '__main__.MySeq'>, <class 'list'>, <class 'printable.Printable'>, <class 'object'>)
在 Printable
的文档字符串中,我注意到“mixin”这个词。为什么在这种情况下我们将其称为 mixin 类?
最佳答案
list
未定义 __str__
方法:
>>> '__str__' in list.__dict__
False
因为它没有定义这样的方法,所以 MRO 中的下一个类可以提供它。对于普通的 list
对象,那就是 object.__str__
:
>>> list.__mro__
(<class 'list'>, <class 'object'>)
>>> list.__str__ is object.__dict__['__str__']
True
但是因为Printable
混入其中,所以它被列在之前object
:
>>> MySeq.__mro__
(<class '__main__.MySeq'>, <class 'list'>, <class '__main__.Printable'>, <class 'object'>)
>>> MySeq.__str__ is Printable.__dict__['__str__']
True
混合类是设计为添加到类层次结构中以与其他基类一起工作的类。 Printable
是一个混合项,因为它需要其他东西实现 __getitem__
。
关于python - Python 中的 MRO 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43963641/
在 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__ 相同,只是它返回的是列表而不是元组。这是一个随机示例
我是一名优秀的程序员,十分优秀!