inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자

다중상속

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

503

govin

작성한 질문수 5

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의 멤버변수가 중복되더라도 문제가 발생하지 않는 것이 맞나요?

python

답변 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

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

quiz 8 오류 문제

0

70

1

str() 작성 위치

0

51

1

아나콘다

0

61

1

윈도우 설치 도와주세요

0

74

1

std_weight함수에서weight만return가능한가요?

0

68

1

오른쪽위 실행버튼을 누르면 터미널에 에러가 뜨고 컨트롤+F5를 누르면 에러가 안뜹니다.

0

35

1

설치해서 시작하는데 문제가 있습니다.

0

70

1

함수 입력할 때 설명 툴팁 나오게 하려면 어떻게 하나요?

0

105

1

2장 환경설정 문의

0

74

1

스타크래프트 프로젝트

0

74

1

python 파일명.py 입력시 Python 출력

0

133

1

로드맵 질문있습니다!

0

85

2

오류

0

74

1

질문 있습니다.

0

75

1

블로그에 학습한 내용을 정리해도 괜찮을까요?

0

172

1

#퀴즈 3의 5번 질문

0

72

1

print("ㅋ"*5) 에 대한 결과가 도출되지 않습니다

0

81

1

가변인자의 위치가 중요한가요?

0

79

1

vscode옛날 버전 설치

0

221

1

글자색상이 선생님처럼 안나옵니다

0

186

1

슬프네

0

156

1

quiz 6번 관련 문의입니다.

0

129

1

퀴즈#3에 대해서 이렇게 작성해도 되나요?

0

194

1

피드백 부탁드립니다

0

93

1