반응형
상속
- 사전적 의미 - 뒤를 이음
- 컴퓨터에서의 의미 - 클래스의 속성과 메소드를 부모가 자식에게 물려주는 것
- 부모(슈퍼) 클래스는 자신의 속성, 메소드들을 자식(서브) 클래스에게 전달 할 수 있음
- 상속을 하게 되면 코드를 재사용 할 수 있는 장점이 있음
- 메소드의 오버라이딩 가능
- 상속받을 자식 클래스는 부모 클래스의 속성과 메소드를 사용
- 자식 클래스의 이름 공간에 부모 클래스의 이름공간이 포함
class 부모 클래스:
내용
class 자식 클래스(부모 클래스) :
내용
상속의 이유
- 코드 재사용
- 상속받은 자식 클래스는 부모 클래스의 모든 기능을 그대로 사용 가능
- 자식 클래스는 필요한 기능만 정의하거나 기존의 기능을 변경(Overriding)할 수 있음
메소드 오버라이딩 (Method Overriding)
- 사전적 - 최우선시되는, 기각하다
- 컴퓨터에서의 의미 - 메소드의 재정의
- 즉, 자식 클래스에서 부모 클래스에 정의된 메소드를 재정의하여 대치하는 것
class Person:
# 생성자
def __init__(self, name):
self.name = name
# 문자형 오버로딩(Overloading), 문자가 입력되면 <Person 이름>으로 출력되게 기능 재정의
def __str__(self):
return '<Person {0}>'.format(self.name)
class Employee(Person):
# 생성자
def __init__(self, name, msg):
Person.__init__(self, name) # 부모 클래스 상속
self.msg = msg
# 중요!!! 문자형 오버라이딩(Overriding), 부모 클래스의 메소드 재정의
def __str__(self):
return '<Person {0} {1}>'.format(self.name, self.msg)
p1 = Person('홍길동')
print(p1.name)
>>> 홍길동
print(p1)
>>> <Person 홍길동>
m1 = Employee('김철수', "안녕하세요")
print(m1.name, m1.msg)
>>> 김철수 안녕하세요
print(m1)
>>> <Person 김철수 안녕하세요>
# 오버라이딩을 하지 않고 m1 호출 >>> <Person 김철수>
# 오버라이딩을 하고 m1 호출 >>> <Person 김철수 안녕하세요>
상속의 다형성
- 다른 클래스에 속한 같은 이름의 인스턴스들이 동일한 메소드 이름으로 호출 할 경우, 동적으로 선택되어 수행
- 다른 클래스에 속한 같은 이름의 다양한 메소드들에게 유사한 작업을 수행시킬 수 있음
- 추상 클래스를 상속하는 다른 서브 클래스 내에 작성된 같은 이름의 메소드를 다른 목적으로 사용 할 수 있음
class Animal:
def cry(self):
return "엉엉"
class Dog(Animal):
def cry(self, a, b):
return a * b
class Duck(Animal):
def cry(self, a ,b):
return a * b
class Fish(Animal):
pass
a = Dog()
b = Duck()
c = Fish()
print( a.cry("멍멍", 3) )
>>> 멍멍멍멍멍멍
print( b.cry(4, 3) )
>>> 7
print( c.cry() )
>>> 엉엉
상속 관계 알아내기 (issubclass)
- issubclass(자식클래스, 부모클래스)
- 순서가 틀리면 False로 나오므로 주의
- 클래스가 같거나 자식 클래스면 True , 아니면 False
class Animal:
def cry(self):
return "엉엉"
# Fish 클래스의 부모 클래스 Animal
class Fish(Animal):
pass
# Cat 클래스의 부모 클래스는 없음
class Cat():
pass
f = Fish()
c = Cat()
print (f.cry()) # >>> 엉엉
print(issubclass(Fish, Animal)) #>>> True
#print (c.cry()) # >>> AttributeError: 'Cat' object has no attribute 'cry'
print(issubclass(Cat, Animal)) #>>> False
반응형