강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của todndi887558
todndi887558

câu hỏi đã được viết

Khóa học Python miễn phí (phần cơ bản) - Chỉ sau 6 giờ, bạn cũng có thể trở thành nhà phát triển

Đa kế thừa

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

Viết

·

488

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

Câu trả lời 2

2

nadocoding님의 프로필 이미지
nadocoding
Người chia sẻ kiến thức

안녕하세요

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

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
Người đặt câu hỏi

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

Hình ảnh hồ sơ của todndi887558
todndi887558

câu hỏi đã được viết

Đặt câu hỏi