클래스 상속
1. 클래스 상속 정의
우선 클래스 상속의 기본 구문을 살펴보겠습니다.
class ClassName(BaseClassName): <statement-1> . . . <statement-N>
클래스를 정의할 때 처음에 언급한 것처럼 상속받은 클래스를 괄호 안에 작성할 수 있습니다. 사용하지 마세요. 클래스를 상속할 때 객체 클래스도 상속하도록 작성해야 합니다. Python에서는 객체 클래스가 모든 클래스의 상위 클래스이기 때문입니다.
물론 위의 내용은 단일 상속이고 Python도 다중 상속을 지원하며 구체적인 구문은 다음과 같습니다.
class ClassName(Base1,Base2,Base3): <statement-1> . . . <statement-N>
다중 상속에 대해 주의할 점: 상위 클래스의 메서드 이름이 동일하지만 언제 지정되지 않는지 하위 클래스에서 이를 사용하면 Python은 괄호 안의 상위 클래스 순서에 따라 왼쪽에서 오른쪽으로 검색합니다. 즉, 하위 클래스에서 메서드를 찾을 수 없으면 왼쪽에서 오른쪽으로 검색하여 상위 클래스에 해당 메서드가 포함되어 있는지 확인합니다. .
그렇다면 상속된 하위 클래스는 무엇을 할 수 있나요?
상속된 하위 클래스의 이점:
상위 클래스의 속성과 메서드를 상속받습니다.
이를 직접 정의하고 상위 클래스의 속성과 메서드를 재정의할 수 있습니다.
2상위 클래스의 메서드를 호출합니다. 클래스가 상위 클래스를 상속합니다. 클래스를 추가한 후 상위 클래스의 메소드를 직접 호출할 수 있습니다. 예를 들어 다음 예에서 UserInfo2는 상위 클래스 UserInfo를 상속하며 상위 클래스의 get_account 메소드를 직접 호출할 수 있습니다.
#!/usr/bin/env python # -*- coding: UTF-8 -*- class UserInfo(object): lv = 5 def __init__(self, name, age, account): self.name = name self._age = age self.__account = account def get_account(self): return self.__account class UserInfo2(UserInfo): pass if __name__ == '__main__': userInfo2 = UserInfo2('两点水', 23, 347073565); print(userInfo2.get_account())3. 상위 클래스 메서드 재작성
물론 상위 클래스 메서드를 재정의할 수도 있습니다.
예:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class UserInfo(object): lv = 5 def __init__(self, name, age, account): self.name = name self._age = age self.__account = account def get_account(self): return self.__account @classmethod def get_name(cls): return cls.lv @property def get_age(self): return self._age class UserInfo2(UserInfo): def __init__(self, name, age, account, sex): super(UserInfo2, self).__init__(name, age, account) self.sex = sex; if __name__ == '__main__': userInfo2 = UserInfo2('两点水', 23, 347073565, '男'); # 打印所有属性 print(dir(userInfo2)) # 打印构造函数中的属性 print(userInfo2.__dict__) print(UserInfo2.get_name())
마지막 인쇄 결과:
이것은 다시 작성된 상위 클래스의 생성자입니다.
4. 서브클래스의 타입 판단
클래스의 상속관계에 있어서 클래스의 타입을 판단해야 할 때가 있습니다.
isinstance() 함수를 사용할 수 있습니다.
예제를 통해 isinstance() 함수의 사용법을 이해할 수 있습니다.
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class User1(object): pass class User2(User1): pass class User3(User2): pass if __name__ == '__main__': user1 = User1() user2 = User2() user3 = User3() # isinstance()就可以告诉我们,一个对象是否是某种类型 print(isinstance(user3, User2)) print(isinstance(user3, User1)) print(isinstance(user3, User3)) # 基本类型也可以用isinstance()判断 print(isinstance('两点水', str)) print(isinstance(347073565, int)) print(isinstance(347073565, str))
의 출력 결과는 다음과 같습니다.
True True True True True False
isinstance()는 객체가 특정 유형인지 여부를 알려줄 수 있을 뿐만 아니라 기본 유형을 판단하는 데에도 사용할 수 있음을 알 수 있습니다.