__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에서 직접
언제 사용해야합니까? 'mro()'의 표준 구현은'__mro__'를 캐시로 사용합니까? 재 계산하지 않는다는 점에서? 그렇다면 '__mro__'의 이유이며 구현 세부 사항으로 간주되어야합니다. 그렇지 않으면, 그것의 목적은 무엇입니까? – burnpanck
@burnpanck. '__mro__'는'super'에 의해 명시 적으로 사용됩니다 : https://docs.python.org/3/reference/datamodel.html#invoking-descriptors –