-
[python] 상속과 클래스Languages/python 2021. 6. 5. 18:12반응형
부모와 자식 클래스
객체지향 프로그래밍에서도 클래스 간의 상속이 존재
-부모클래스(parent class)와 자식 클래스(child class)
자식 클래스는 부모 클래스에 이미 구현된 메서드나 속성을 상속만으로 그대로 사용
중복을 최소화 시킬 수 있는 기본적인 장점 뿐 아니라 필요하면 수정 가능
부모 클래스
기본 클래스
또는 슈퍼 클래스
자식클래스
유도 클래스
또는 서브 클래스
최상위 클래스 object
모든 클래스의 가장 최상위 클래스는 object
객체지향의 상속도 여러 수준에 걸쳐 상속이 가능
부모 클래스를 지정하지 않는 모든 클래스는 부모가 모두 object
상속으로 클래스 정의
부모가 Rpbot인 자식 클래스 HumanoidRobot
괄호 안에 부모 클래스를 적어 상속을 정의
클래스 Robot은 달리 부모를 지정하지 않았으므로 클래스 object가 부모 클래스
class Robot: def __init__(self): self.laws = '인간에게 해를 입혀서는 안됩니다' def hello(self): print('전 로봇입니다.') def __str__(self): return '전 로봇으로' + self.laws class HumanoidRobot(Robot): def __init__(self,name): self.name = name def speak(self): print('%s는 사람처럼 말을 할 수 없습니다' % self.name) roboi = Robot() print(roboi) hr = HumanoidRobot('아시모') hr.hello() hr.speak() =================== RESTART: C:/Users/파이썬 연습과제/sagdasfg.py ================== 전 로봇으로인간에게 해를 입혀서는 안됩니다 전 로봇입니다. 아시모는 사람처럼 말을 할 수 없습니다 >>>
부모 초기화 메소드 호출
클래스 Singer의 자식 클래스로 KPopGroup
super(), __init__(name,debut)
클래스 KPopGroup() 초기화 메소드 __init__ 에서 인잘 받은 name과 debut
부모의 속성으로 name과 debut을 지정하기 위해 내장 함수 super()를 사용해 호출
내장 함수 super()
상위 클래스의 객체를 반환하는 함수
super(),메소드명()을 사용
자식 클래스에서 이름이
동일한 부모 클래스의 메소드를 호출
class Singer: def __init__(self,name,debut): self.name = name self.debut = debut
이름이 다르면 self.부모메소드명()으로도 호출
class KPopGroup(Singer): def __init__(self,name,debut,cnt): super().__init__(name,debut) self.cnt = cnt
내장함수 super()의 사용과 메소드 오버라이딩
메소드 오버라이딩
부모의 메소드를 자식 클래스에서 다시 구현
중복을 최소화하면서 좀 더 구체적인 메소드 수정에 유용하게 사용
메소드 대체 또는 메소드 재정의라고도 부름
class Singer: def __init__(self,name,debut): self.name = name self.debut = debut def introduce(self): print('안녕하세요! 가수 %s입니다' % self.name) def age(self): print('데뷔한지 %d년 됐네요' % (2020 - self.debut + 1)) class KPopGroup(Singer): def __init__(self,name,debut,cnt): super().__init__(name,debut) self.cnt = cnt def introduce(self): super().introduce() print('우린 케이팝그룹으로 %d명 입니다.' % self.cnt) bts = KPopGroup('bts',2013,7) bts.introduce() bts.age() =================== RESTART: C:/Users/파이썬 연습과제/sagdasfg.py ================== 안녕하세요! 가수 bts입니다 우린 케이팝그룹으로 7명 입니다. 데뷔한지 8년 됐네요 >>>
부모가 여러 개인 다중 상속
다중상속(mutiple inheritance)
클래스가 둘 이상의 부모 클래스를 가져 여러 부모의 속성과 매소드를 상속받을 수 있는 기능
subclass(subclass1, subclass2, subclass3, subclass4, ...)
class student(): def study(self): print('공부') class Employee(): def work(self): print('일') class Assistant(Student, Employee): def do(self): self.study() self.work() i = Assisntant() i.do()
다이아몬드 상속
자바는 다중상속을 허용 x
가장 하위인 클래스 D는 클래스 B와 클래스 C를 상속받으므로 클래스 A를 두 번 상속받는 문제가 발생
메소드 탐색 순서를 확인하는 메소드 mro()
MRO(method resolution order)
파이썬의 다중 상속에서 메소드를 접근하는 순서를 '메소드 탐색 순서'
메소드 탐색 순서는 자기 자신이 제일 먼저이고,
이후 다중 상속인 경우일 때 왼쪽에 있을수록 우선순위가 높으며, 그 다음으로 다시 상위 클래스 순서
가장 나중은 최상윜 클래스인 object 클래스
순서를 알아볼 수 있구나 정도만 알고 넘어가자!
추상 메소드
아직 구현이 종료되지 않은 미완성 메소드로, 다음과 같이 구현
추상 클래스를 지원하는 모듈 abc를 가져오기 위해 import
정의되는 클래스의 괄호 안에 metclass = abc.ABCMeta를 지정
추상 메소드 머리 위에 데커레이터를 넣어 메소드가 추상이라는 것을 지정
추상 메소드는 구현이 없거나 미완성
from abc import * class Polygon(metaclass = ABCMeta): @abstractmethod def area(self): pass
예제) 추상 메소드 선언과 자식 클래스에서의 구현
from abc import * class Polygon(metaclass = ABCMeta): @abstractmethod def area(self): pass class Triangle(Polygon): def __init__(self,width,height): self.width = width self.height = height def area(self): return self.width * self.height/2 tri = Triangle(2.4,4.3) print('삼각형 면적:%.2f' % tri.area()) =================== RESTART: C:/Users/파이썬 연습과제/sagdasfg.py ================== 삼각형 면적:5.16 >>>
객체화할 수 없는 추상 클래스
추상 클래스(abstract class)
미완성인 추상 메소드를 적어도 하나 이상 갖는 클래스
부모인 추상 클래스는 자신만을 객체 인스턴스로 생성 불가능
추상 메소드는 자식 클래스에서 반드시 구현
추상 클래스 polygon의 객체화에서 발생한 TypeError 오류
추상 메소드 area()를 갖고 잇는 추상 클래스 polygon을 상속받는 사각형 Rectangle도 반드시
추상메소드 area()를 재정의해야 함
재정의하지 않으면 TypeError 오류가 발생
from abc import * class Polygon(metaclass = ABCMeta): @abstractmethod def area(self): print('면적 구하기 메소드 구현') class Rectangle(Polygon): def __init__(self,width,height): self.width = width self.height = height def area(self): return self.width * self.height rect = Rectangle(2.4, 4.3) print('사각형 면적:%.2f'%rect.area()) >>> 사각현 면적:10.32
반응형'Languages > python' 카테고리의 다른 글
[python] 파이썬을 이용한 빅데이터 실습 2 조건 색인 (0) 2021.09.12 [python] 파이썬을 이용한 빅데이터 실습1 - Series (2) 2021.09.12 [python] 객체 지향 프로그래밍, 간단한 클래스의 정의와 활용, 내장 함수 isinstance, 매직 메소드(magic method) (0) 2021.06.05 [python] 파일 쓰기 write()와 읽기read()/ 파일 열기 함수 open() /파일 읽기 readlines()와 readline()/ 파일 읽기의 예외 처리/ mode='x'/바이너리 (0) 2021.05.30 [python] 실행 오류 및 파일을 다루는 예외 처리와 파일 입출력 (0) 2021.05.26