내 클래스의 모든 믹스 인에 대해 동일한 메서드를 호출하고 싶습니다. 다음은 두 가지 변형입니다.
class MixinA(object):
def get_id(self):
return "A"
class MixinB(object):
def get_id(self):
return "B"
class Base(object):
def get_id(self):
for base_class in inspect.getmro(self.__class__):
return ",".join(base_class.get_id())
class Instance(MixinA, MixinB, Base):
pass
class MyTestCase(unittest.TestCase):
def test_multiple_mixin_methods(self):
"""
Sadly, we cannot call all mixin methods.
:return:
"""
ids = set(Instance().get_id())
print(ids)
assert ids == {"A", "B"}
슬프게도 이것은 실패합니다. 나는 'A'만 돌려받습니다. 'A'와 'B'가 포함 된 목록을 원합니다. 순서는 중요하지 않습니다.
내가 여기서 뭘 잘못하고 있니?
많은 감사
필요한 것은 슈퍼에 전화하는 것입니다. super는 MRO에서 다음 메서드를 호출하므로 A => B를 호출합니다. Base 클래스는 필요하지 않습니다.
class MixinA(object):
def get_id(self):
return "A", super(MixinA, self).get_id()
class MixinB(object):
def get_id(self):
return "B"
class Instance(MixinA, MixinB):
pass
우선은 Instance().get_id()
할 수 호출 A.get_id()
후 슈퍼에 대한 호출이 B 인 MRO의 다음 메소드를 호출
최신 정보
class MixinA(object):
def get_id(self):
return "A"
class MixinB(object):
def get_id(self):
return "B"
class Base(object):
def get_id(self):
return set([base_class.get_id(self) for base_class in inspect.getmro(self.__class__)[2:-1]])
class Instance(Base, MixinA, MixinB):
pass
믹스 인이 독립적이기 전과는 다릅니다. 이 예에서는 Base 클래스가 The MRO에서 첫 번째가되어야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다