何がmro()
する?
for t in type(res).mro(): # <----- this
if t in self.__dispatch:
return self.__dispatch[t][funcname](res, *args, **kw)
ベストアンサー1
フォローしてください...:
>>> class A(object): pass
...
>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>> class B(A): pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
>>> class C(A): pass
...
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
>>>
単一継承である限り、__mro__
クラス、そのベース、そのベースのベース、などというタプルになりますobject
(もちろん、新しいスタイルのクラスでのみ機能します)。
さて、複数継承...:
>>> class D(B, C): pass
...
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
__mro__
...また、 では、クラスが重複せず、祖先の後にクラスが来ないことが保証されます。ただし、多重継承の同じレベルで最初に入るクラス (この例の B と C など) は__mro__
左から右になります。
メソッドだけでなく、クラスのインスタンスで取得するすべての属性は、概念的には に沿って検索される__mro__
ため、祖先の中で複数のクラスがその名前を定義している場合、これによって、その名前を定義する の最初のクラスで属性が見つかる場所がわかります__mro__
。