• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

다중상속시 멤버변수의 중복 호출문제

20.04.07 23:36 작성 조회수 305

2

안녕하세요 선생님, 좋은 강의 잘 듣고 있습니다. 항상 감사합니다.

"다중상속"영상을 잘 보았습니다. 해당 코드에서 AttackUnit은 name을 멤버변수로 가진 반면에, Flyable은 name을 멤버변수로 가지지 않았습니다.

이를 눈여겨보고, 저는 다음과 같이 코드를 바꿔보았습니다. AttackUnit과 Flyable 모두에서 name을 멤버변수로 가지도록 하고, 마찬가지로 FlyableAttackUnit을 만들어 두 class로부터 다중상속했습니다;

# 일반 유닛
class Unit:
    def __init__(self,name,hp):
        self.name=name
        self.hp=hp

# 공격 유닛
class AttackUnit(Unit):
    def __init__(self,name,hp,damage):
        Unit.__init__(self,name,hp)
        self.damage=damage

# 공중 유닛
class Flyable:
    def __init__(self,name,flying_speed):
        self.flying_speed=flying_speed
    def fly(self,location):
        print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(self.name,location,self.flying_speed))

# 공중 공격 유닛
class FlyableAttackUnit(AttackUnit,Flyable):
    def __init__(self,name,hp,damage,flying_speed):
        AttackUnit.__init__(self,name,hp,damage)
        Flyable.__init__(self,flying_speed,name)

valkyrie=FlyableAttackUnit("발키리",200,6,5)
valkyrie.fly("9시")

그 결과 문제없이 작동되었는데요. 이와 관련해서 질문입니다.

(1) Flyable에서는 name을 멤버변수로 설정하지 않으신 것은, 혹시 중복을 막기 위한 의도셨나요?

(2) 일반적으로 (제가 했던 것과 같이) 두 개의 부모 class의 멤버변수가 중복되더라도 문제가 발생하지 않는 것이 맞나요?

답변 2

·

답변을 작성해보세요.

2

안녕하세요

질문 주신 코드가 혹시 이렇게 되길 의도하셨던거 아닌가요?

class Flyable:
    def __init__(self,name,flying_speed):
        self.name=name
        self.flying_speed=flying_speed

    def fly(self,location):
        print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(self.name,location,self.flying_speed))

위에 적으신 코드는 name 을 전달받기는 하지만 name 에 넣지는 않고 있어서요.

위 경우라도 Unit 클래스의 name 값이 있어서 가져다가 잘 표시해주기는 합니다.

왜냐하면 다중 상속을 받을 경우 상속 받은 순서대로 앞에서부터 뒤로 가면서 해당 값이 있는지 확인하고 있으면 쓰기 때문이지요.

하지만 만약 다른 예제에서 Flyable 과 같은 클래스가 단독으로 쓰인다면 name 멤버변수가 없기 때문에 에러가 발생합니다.

fly  함수에서는 self 에 있지도 않은 name 변수를 가져다 쓰고 있어서, 향후에 혼돈을 야기할 수도 있습니다.

Flying 클래스는 '날기 기능'만 구현하기 위해 name 을 정의하지 않았습니다.

2번째 답변은 아래 예제를 참고해주세요.

A 와 B 를 다중상속 받은 C 에서 name 을 찍으면 A 가 찍힙니다.

하지만 주석 처리된 대로 상속 순서를 B, A 로 바꾸면 B 가 찍히게 되지요.

코드상 에러가 있지는 않지만 같은 이름의 멤버변수가 있는 클래스를 다중 상속 시에는 사용자의 주의를 요하게 됩니다. ^^

class A:
    def __init__(self):
        self.name = "A"    

class B:
    def __init__(self):
        self.name = "B"      

class C(AB): # class C(B, A)
    def show(self):
        print(self.name)

c = C()
c.show()

0

govin님의 프로필

govin

질문자

2020.04.27

답변 감사합니다. A와 B에 같은 name이 있으면 주의해야 하는군요. 감사합니다.