개발자 미니민의 개발스터디

[파이썬] 클래스 다중상속, 추상 메서드

by mini_min
[파이썬] 클래스 다중상속, 추상 메서드

🖋️ 다중상속

: child 클래스의 아버지는 A, B 클래스 2명이다.

A, B 클래스 모두 fun 이라는 동일한 메서드를 가지고 있는데, 동일한 메서드가 있는 경우 나열순서대로 찾는다. 그래서 A 클래스의 메서드가 나온다. 

# 다중 상속
class A:
    def fun(self):
        print("A함수...")
    
    def test(self):
        print("A_test...")  

class B:
    def fun(self):
        print("B함수...")
    def sub(self):
        print("B_sub...")

class Child(A, B): #child의 아버지 2명 
    def write(self):
        self.fun() # 동일한 메서드는 나열순서로 찾는다. 그래서 A꺼나옴
        # super().fun()
        A.fun(self)
        B.fun(self) #위에서는 클래스명으로 부를 수 있지만 아래에서는 못함
        
obj = Child()

obj.write() # A함수...
obj.fun() # A함수... / 동일한 메서드는 나열순서로 찾는다. 그래서 A꺼나옴
 
obj.test() #A_test...
obj.sub() # B_sub...

 

: B, C 클래스를 다중 상속 받는 경우, 순서대로 출력한다.

# 다중 상속
class A:
    def __init__(self):
        print("A 클래스...")
        
class B(A):
    def __init__(self):
        print("B 클래스...")
        A.__init__(self)

class C(A):
    def __init__(self):
        print("C 클래스...")
        A.__init__(self)
        
class D(B, C):
    def __init__(self):
        print("D 클래스...") #D클래스/B클래스/A클래스/C클래스/A클래스
        B.__init__(self)
        C.__init__(self)

obj = D() # A 두번출력

 

: 다이아몬드 상속. super()__init__() 으로 B클래스 상속

# 다중 상속
class A:
    def __init__(self):
        print("A 클래스...")
        
class B(A):
    def __init__(self):
        print("B 클래스...")
        A.__init__(self)

class C(A):
    def __init__(self):
        print("C 클래스...")
        A.__init__(self)
        
class D(B, C): # 다이아몬드 상속 
    def __init__(self):
        print("D 클래스...") #D
        super().__init__()  #B/A

obj = D() # D, B, A,

 

: print(D.__mro__) : 메서드 실행 순서 확인

# 다중 상속
class A:
    def fun(self):
        print("A 클래스...")
        
class B(A):
    def fun(self):
        print("B 클래스...")

class C(A):
    def fun(self):
        print("C 클래스...")
        
class D(B, C): # 다이아몬드 상속 
    def fun(self):
        print("D 클래스...")

print(D.__mro__) # 메서드 실행 순서 확인 
# D > B > C > A > object

obj = D()
obj.fun() # D 자기꺼 먼저
obj.fun() # 젤 가까운 B fun2 일때

 

🖋️ 추상 메서드

: 추상 메서드는 abc 모듈을 import 해야한다.

# 추상 메서드
# 추상 메서드는 abc 모듈을 import 해야한다. 

from abc import ABC, abstractmethod

class Test(ABC):
    def fun(self):
        print("fun...")
        
    @abstractmethod
    def state(self):
        pass
    
class Demo(Test):
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def state(self):
        return "성인" if self.age >= 19 else "미성년자"
    
    def write(self):
        print(f"{self.name}, {self.age}, {self.state()}")

# obj = Test() # 에러

obj = Demo('김자바', 33)
obj.write()

 

: 연산자 중복 정의 

# 연산자 중복 정의  

class Test:
    def __init__(self, num):
        self.num = num
    
    #연산자 중복 정의 
    def __add__(self, num): #매직 메서드 
        self.num += num
    def __sub__(self, num): #매직 메서드 
        self.num -= num   
        
        
obj = Test(5)

obj + 10
print(obj.num)

obj - 10
print(obj.num)

# 100 + obj # 에러
# 연산자 중복 정의  

class Test:
    def __init__(self, num):
        self.num = num
    
    #연산자 중복 정의 
    def __add__(self, num): #객체+값
        self.num += num
    def __radd__(self, num): #값+객체
        self.num += num
        
    def __sub__(self, num): 
        self.num -= num   
    def __rsub__(self, num): 
        self.num -= num       
        
obj = Test(5)

obj + 10
print(obj.num)

100 + obj
print(obj.num)

 

: iterator 

it.__next__() 로 다음 값 출력 가능하다.

t = (1,2,3)

it = iter(t)

print(it.__next__())
print(it.__next__())
print(it.__next__())
# print(it.__next__()) # 예외
t = (1,2,3)

it = iter(t)

try:
    while True:
        #print(it.__next__())
        print(next(it))
except StopIteration:
    print("끝!")
t = (1,2,3)

it = iter(t)

while True:
    a = next(it, None)
    if not a:break
    print(a)

 

 

 

'Python' 카테고리의 다른 글

[파이썬] 예외  (0) 2022.12.25
[파이썬] 모듈  (0) 2022.12.25
[파이썬] 클래스 2  (0) 2022.12.25
[파이썬] 클래스  (0) 2022.12.18
[파이썬] 함수  (0) 2022.12.18

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기