"mro()"는 무엇을 합니까?
무엇을 합니까?
예:
for t in type(res).mro(): # <----- this
if t in self.__dispatch:
return self.__dispatch[t][funcname](res, *args, **kw)
따라오세요...:
>>> 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__
해당 이름을 정의합니다.
mro()
Method Resolution Order의 약자입니다.클래스가 파생된 유형의 목록을 메서드를 검색한 순서대로 반환합니다.
mro()
그리고.__mro__
새로운 스타일의 클래스에서만 작업합니다.Python 3에서는 문제 없이 작동합니다.그러나 Python 2에서는 이러한 클래스가 다음에서 상속되어야 합니다.object
.
이것은 아마도 해결 순서를 보여줄 것입니다.
class A(object):
def dothis(self):
print('I am from A class')
class B(A):
pass
class C(object):
def dothis(self):
print('I am from C class')
class D(B, C):
pass
d_instance = D()
d_instance.dothis()
print(D.mro())
출력은 다음과 같습니다.
I am from A class
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>]
규칙은 깊이 우선이며, 이 경우에는 다음을 의미합니다.D
,B
,A
,C
.
Python은 일반적으로 상속 클래스를 검색할 때 깊이 우선 순서를 사용하지만 두 클래스가 동일한 클래스에서 상속되면 MRO에서 해당 클래스에 대한 첫 번째 언급을 제거합니다.
다이아몬드 상속의 경우 해결 순서가 다릅니다.
class A(object):
def dothis(self):
print('I am from A class')
class B1(A):
def dothis(self):
print('I am from B1 class')
# pass
class B2(object):
def dothis(self):
print('I am from B2 class')
# pass
class B3(A):
def dothis(self):
print('I am from B3 class')
# Diamond inheritance
class D1(B1, B3):
pass
class D2(B1, B2):
pass
d1_instance = D1()
d1_instance.dothis()
# I am from B1 class
print(D1.__mro__)
# (<class '__main__.D1'>, <class '__main__.B1'>, <class '__main__.B3'>, <class '__main__.A'>, <class 'object'>)
d2_instance = D2()
d2_instance.dothis()
# I am from B1 class
print(D2.__mro__)
# (<class '__main__.D2'>, <class '__main__.B1'>, <class '__main__.A'>, <class '__main__.B2'>, <class 'object'>)
@stryker의 예에서 C3 알고리즘은 다음과 같습니다.
L[D(B,C)] = D + merge(BAo, Co, BC)
= D + B + merge(Ao, Co, C)
= DB + A + merge(o, Co, C)
= DBA + merge(Co, C)
= DBACo
Python 2.3 방법 해결 순서 참조 | Python.org
언급URL : https://stackoverflow.com/questions/2010692/what-does-mro-do
'programing' 카테고리의 다른 글
Android에서 SQLite를 사용할 때 동시성 문제를 방지하려면 어떻게 해야 합니까? (0) | 2023.06.11 |
---|---|
Visual Studio ASP.Net MVC 실행 취소를 시작 페이지 작업으로 설정 (0) | 2023.06.11 |
목록에 대한 모델 유효성 검사 보기 (0) | 2023.06.11 |
코코아 및 목표-C를 사용한 참조 카운트 이해 (0) | 2023.06.11 |
없음 값을 사용하여 Pyspark 데이터 프레임 열 필터링 (0) | 2023.06.11 |