클래스 간의 관계 확인
- 상속 관계인 두 클래스 간의 관계를 확인하기 위해
issubclass()
내장 함수를 이용할 수 있다.
issubclass(자식 클래스, 부모 클래스)
print(issubclass(Student, Person))
print(issubclass(Person, Student))
print(issubclass(Person, Person))
print(issubclass(Person, object))
print(issubclass(Student, object))
True
False
True
True
True
-
어떤 클래스의 부모 클래스를 알기 위해서는
__base__
속성을 사용해 알 수 있다. -
이 속성은
직계 부모 클래스
를튜플
로 반환한다.
print(Person.__bases__)
print(Student.__bases__)
print(Gid.__bases__)
(<class 'object'>,)
(<class '__main__.Person'>,)
(<class '__main__.Student'>,)
super()를 이용한 상위 클래스의 메서드 호출
-
이렇게 작성한 클래스는
아래와 같이 Animal 클래스의 생성자를 2번 호출하게 되는 문제가 있다.
이러한 문제는
다이아몬드 형태
로상속
되는 경우가 발생한다.
class Animal:
def __init__(self):
print("Animal")
class Tiger(Animal):
def __init__(self):
Animal.__init__(self)
print("Tiger")
class Lion(Animal):
def __init__(self):
Animal.__init__(self)
print("Lion")
class Liger(Tiger,Lion):
def __init__(self):
Tiger.__init__(self)
Lion.__init__(self)
print("Liger")
l = Liger()
Animal
Tiger
Animal
Lion
Liger
-
이러한 문제를 해결하기 위해
super()
내장 함수를 사용한다. -
super()
함수의 반환값은 부모 클래스의 객체를 반환하게 된다. -
다른 언어에서 찾아볼 수 없는 동적 실행 환경에서 클래스 간에 상호 동작으로 다중 상속 문제를 해결할 수 있다.
-
예를 들어 Liger 클래스의 부모 클래스인 (Tiger, Lion)클래스가 모두 Animal 클래스의 자식인 것을
파이썬 인터프리터가 파악해 Animal 클래스의 생성자 메서드가 2번 호출되는 것을 피할 수 있다.
class Animal:
def __init__(self):
print("Animal")
class Tiger(Animal):
def __init__(self):
super().__init__()
print("Tiger")
class Lion(Animal):
def __init__(self):
super().__init__()
print("Lion")
class Liger(Tiger,Lion):
def __init__(self):
super().__init__()
print("Liger")