[파이썬] 클래스 다중상속, 추상 메서드
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)
블로그의 정보
개발자 미니민의 개발로그
mini_min