ABOUT ME

Today
Yesterday
Total
  • [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
    반응형

    댓글

Designed by Tistory.