TypeError: 일관된 MRO(Method Resolution Order)를 만들 수 없습니다.
이 코드는 제 게임에 사용할 코드이지만 MRO 오류에 대해 불만을 제기합니다.
class Player:
pass
class Enemy(Player):
pass
class GameObject(Player, Enemy):
pass
g = GameObject()
당신의.GameObject
에서 상속 중입니다.Player
그리고. Enemy
.왜냐면Enemy
이미 상속됨Player
Python은 이제 메소드를 먼저 찾을 클래스를 결정할 수 없습니다.Player
, 또는 위에Enemy
, 에 정의된 것들을 무시할 수 있는Player
.
모든 기본 클래스의 이름을 지정할 필요는 없습니다.Enemy
여기 있습니다. 해당 클래스에서 상속하십시오.
class GameObject(Enemy):
pass
Enemy
이미 포함된Player
, 다시 포함시킬 필요는 없습니다.
원래 코드가 작동하지 않는 이유를 설명하겠습니다.
Python은 인스턴스 속성/메소드를 조회할 때 (직접 및 간접) 기본 클래스를 통해 검색할 순서를 결정해야 합니다.C3 또는 MRO라는 알고리즘을 사용하여 상속 그래프를 선형화함으로써, 즉 기본 클래스의 그래프를 시퀀스로 변환함으로써 이를 수행합니다.MRO 알고리즘은 몇 가지 바람직한 특성을 달성하는 유일한 알고리즘입니다.
- 각 조상 클래스는 정확히 한 번 나타납니다.
- 클래스는 항상 조상 앞에 나타납니다(" monot성").
- 동일한 클래스의 직접 부모는 클래스 정의에 나열된 것과 같은 순서로 표시되어야 합니다(" consistent 로컬 우선 순위").
- 반 아이들이라면
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) 합니다.a
Player
.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
'programing' 카테고리의 다른 글
haveing 절'에 알 수 없는 열이 있습니다. (0) | 2023.10.04 |
---|---|
초기화되지 않은 정수는 항상 c에서 0으로 기본 설정됩니까? (0) | 2023.10.04 |
"ORA-04068: 패키지의 기존 상태가 폐기되었습니다 ORA-04065: 실행되지 않거나, 변경되거나, 저장 프로시저가 삭제되었습니다 (0) | 2023.10.04 |
jQuery.parseJSON vs JSON.parse (0) | 2023.10.04 |
ASP에서 사용할 수 있는 프레임워크는 무엇입니까?NET Core(ASP).NET 5) 애플리케이션? (0) | 2023.10.04 |