programing

TypeError: 일관된 MRO(Method Resolution Order)를 만들 수 없습니다.

skycolor 2023. 10. 4. 21:07
반응형

TypeError: 일관된 MRO(Method Resolution Order)를 만들 수 없습니다.

이 코드는 제 게임에 사용할 코드이지만 MRO 오류에 대해 불만을 제기합니다.

class Player:
    pass

class Enemy(Player):
    pass

class GameObject(Player, Enemy):
    pass

g = GameObject()

당신의.GameObject에서 상속 중입니다.Player 그리고. Enemy.왜냐면Enemy 이미 상속됨PlayerPython은 이제 메소드를 먼저 찾을 클래스를 결정할 수 없습니다.Player, 또는 위에Enemy, 에 정의된 것들을 무시할 수 있는Player.

모든 기본 클래스의 이름을 지정할 필요는 없습니다.Enemy여기 있습니다. 해당 클래스에서 상속하십시오.

class GameObject(Enemy):
    pass

Enemy이미 포함된Player, 다시 포함시킬 필요는 없습니다.

원래 코드가 작동하지 않는 이유를 설명하겠습니다.

Python은 인스턴스 속성/메소드를 조회할 때 (직접 및 간접) 기본 클래스를 통해 검색할 순서를 결정해야 합니다.C3 또는 MRO라는 알고리즘을 사용하여 상속 그래프를 선형화함으로써, 즉 기본 클래스의 그래프를 시퀀스로 변환함으로써 이를 수행합니다.MRO 알고리즘은 몇 가지 바람직한 특성을 달성하는 유일한 알고리즘입니다.

  1. 각 조상 클래스는 정확히 한 번 나타납니다.
  2. 클래스는 항상 조상 앞에 나타납니다(" monot성").
  3. 동일한 클래스의 직접 부모는 클래스 정의에 나열된 것과 같은 순서로 표시되어야 합니다(" consistent 로컬 우선 순위").
  4. 반 아이들이라면A아이들 앞에 항상 나타나요.B,그리고나서A앞에 나타나야 함B("consist 확장 우선 순위")

당신의 코드로 두번째 제약 조건은Enemy첫 번째로 나타납니다. 세 번째 제약 조건은 다음을 요구합니다.Player먼저 나타납니다.모든 제약 조건을 만족시킬 수 있는 방법이 없으므로 python은 사용자의 상속 계층 구조가 불법이라고 보고합니다.

기본 클래스의 순서를 바꾸면 코드가 작동합니다.GameObject다음과 같습니다.

class GameObject(Enemy, Player):
    pass

이것은 단지 기술적인 세부사항이 아닙니다.메소드가 여러 클래스에서 정의된 경우(희귀한 경우) 호출한 메소드를 잡기 위해 어떤 클래스를 사용해야 하는지 생각해 볼 수 있습니다.기본 클래스를 정의하는 순서에 따라 이 선택 항목이 달라집니다.

당신이 쓴 글은 당신이 원하는 것은GameObject 다a인Player그리고 또Enemy . .Enemy.Player.a인에Player에서 이 .GameObject(instance)는입니다(instance) 합니다.aPlayer.Player당신은 당신의 것을 통해 물려받습니다.Enemy상속?

하지만 정말 상속 대신 작곡을 사용하고 싶지 않으신가요?

class GameObject(object):
    def __init__(self):
        self.player = Player()
        self.enemy = Enemy()

언급URL : https://stackoverflow.com/questions/29214888/typeerror-cannot-create-a-consistent-method-resolution-order-mro

반응형