2013-10-31 3 views
5

__metaclass__ = abc.ABCMeta을 사용했을 때이 여분의 것을 발견했을 때 mro 메서드가 밑줄을 긋지 않았습니다. 튜플 대신 목록을 반환한다는 점을 제외하고는 __mro__과 같습니다. 다음은 임의의 예 (ideone snippet는)입니다 :mro 메소드와 클래스의 __mro__ 속성의 차이점은 무엇입니까?

import abc 
import copy 

class Life(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractmethod 
    def reproduce(self): 
     pass 

class Bacterium(Life): 
    def reproduce(self): 
     return copy.deepcopy(self) 

wiggly = Bacterium() 

print wiggly.__class__.__mro__ 
# (<class '__main__.Bacterium'>, <class '__main__.Life'>, <type 'object'>) 

print wiggly.__class__.mro() 
# [<class '__main__.Bacterium'>, <class '__main__.Life'>, <type 'object'>] 

내가이 ABCMeta 고유의 것이 아니라 모든 새로운 스타일의 클래스에서 사용할 수 있음을 나중에 발견했다.

그래서 ... 왜? __mro__이하는 일은 무엇입니까? the documentation에서 직접

답변

7

:

이 메소드가 인스턴스에 대한 방법을 확인 순서를 사용자 정의하는 메타 클래스에 의해 오버라이드 (override) 할 수 있습니다. 클래스 인스턴스화시에 호출되어 그 결과는 __mro__에 저장됩니다.

꽤 단정 나에게 ...

mro()는 instanciation에 전화를 __mro__에 그 결과를 저장한다. 그들은 실제로 같은 목적을 가지고 있지 않습니다.

+1

언제 사용해야합니까? 'mro()'의 표준 구현은'__mro__'를 캐시로 사용합니까? 재 계산하지 않는다는 점에서? 그렇다면 '__mro__'의 이유이며 구현 세부 사항으로 간주되어야합니다. 그렇지 않으면, 그것의 목적은 무엇입니까? – burnpanck

+0

@burnpanck. '__mro__'는'super'에 의해 명시 적으로 사용됩니다 : https://docs.python.org/3/reference/datamodel.html#invoking-descriptors –

관련 문제