문제

~ 안에 django.utils.functional.py:

for t in type(res).mro():  # <----- this
    if t in self.__dispatch:
        return self.__dispatch[t][funcname](res, *args, **kw)

모르겠어요 mro(). 그것이 무엇을하고 "MRO"는 무엇을 의미합니까?

도움이 되었습니까?

해결책

을 따라서...:

>>> 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() 메소드 해상도 순서를 나타냅니다. 클래스가 메소드를 검색하는 순서대로 클래스가 파생 된 유형 목록을 반환합니다.

mro () 또는 __mro__ 새로운 스타일 수업에서만 작동합니다. Python 3에서는 아무런 문제없이 작동합니다. 그러나 Python 2에서는 그 클래스가 물체에서 상속해야합니다.

이것은 아마도 해결의 순서를 보여줄 것입니다.

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를 의미합니다.

파이썬은 일반적으로 a 깊이 우선 상속 클래스를 검색 할 때 주문하지만 두 클래스가 같은 클래스에서 상속 될 때 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'>)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top