클래스 상속


클래스 상속하기

클래스를 정의할 때, 괄호안에 다른 클래스를 입력해주면, 그 클래스의 속성을 상속받습니다.

예제

class Person:

  def __init__(self, age, gender):
    self.age = age
    self.gender = gender

  def say_hello(self):
    print('Hello')

p1 = Person(10, 'Male')
print(p1.age, p1.gender)
p1.say_hello()


class Monkey(Person):
  pass


m1 = Monkey(12, 'Female')
print(m1.age, m1.gender)
m1.say_hello()
10 Male
Hello
12 Female
Hello

예제에서 Monkey 클래스를 정의할 때 입력해준

Person 클래스는 부모 클래스(parent class) 또는 베이스 클래스(base class) 라고 부르고,

Monkey 클래스는 자식 클래스(child class) 또는 파생 클래스(derived class) 라고 합니다.



메서드 오버라이딩 (Method Overriding)

파생 클래스는 베이스 클래스의 메서드를 오버라이드할 수 있습니다.

(같은 객체의 다른 메서드를 호출하는데에는 특별한 우선순위가 없기 때문에, 베이스 클래스에서 다른 메서드를 호출하는 메서드는 그것을 오버라이드하는 파생 클래스의 메서드를 호출하게 될 수 있습니다.)

예제1

class Monkey(Person):
  def __init__(self, age):
    self.age = age

m2 =  Monkey(Person)
m2.say_hello()
print(m2.age, m2.gender)
Hello
Traceback (most recent call last):
  File "main.py", line 29, in <module>
AttributeError: 'Monkey' object has no attribute 'gender'

파생 클래스의 __init__() 함수는 베이스 클래스의 __init__() 함수를 오버라이드합니다.

이제 Monkey 클래스의 인스턴스를 만들면, 베이스 클래스가 아닌 파생된 클래스의 __init__() 함수가 실행됩니다.



예제2

class Monkey(Person):
  def __init__(self, age, gender):
    Person.__init__(self, age, gender)

m3 = Monkey(3, 'Male')
print(m3.age, m3.gender)
3 Male

위의 예제와 같이 Person 클래스의 __init__() 함수를 그대로 사용할 수 있습니다.



super()

예제

class Monkey(Person):
  def __init__(self, age, gender):
    super().__init__(age, gender)

m3 = Monkey(3, 'Male')
print(m3.age, m3.gender)
3 Male

파생 클래스에서 베이스 클래스를 참조하기 위해 내장함수 super() 를 사용하는게 더 나은데,

super().__init__(age, gender)Person.__init__(self, age, gender) 와 같습니다.



속성 추가하기

예제

class Monkey(Person):
  def __init__(self, age, gender, disease):
    super().__init__(age, gender)
    self.disease = disease

m3 = Monkey(3, 'Male', False)
print(m3.age, m3.gender, m3.disease)
3 Male False

베이스 클래스에 없던 새로운 클래스 변수를 추가할 수도 있습니다.



이전글/다음글