Gidhub BE Developer

클래스 간의 관계 확인, super()

2018-02-06
goodGid

클래스 간의 관계 확인

  • 상속 관계인 두 클래스 간의 관계를 확인하기 위해 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")


Comments

Content