티스토리 뷰

📌  상속

자식 클래스가 부모 클래스로부터 멤버 변수와 멤버 메서드를 물려받는 것을 말한다. 부모 클래스에게서 상속받은 메서드를 자식 클래스에서 기능을 확장(오버 라이딩)할 수 있다. 클래스 내부의 메서드가 기능이 구현되어 있지 않은 추상 메서드인 경우 추상 클래스라고 하며, 이를 상속받은 자식 클래스는 반드시 추상 메서드를 구현해주어야 한다.

 

📍  자식 클래스가 부모 클래스로부터 멤버를 상속받는다.

📍  부모 클래스로부터 상속받은 메서드를 재 정의하는 것을 오버 라이딩이라고 한다.

📍  부모 클래스의 멤버를 사용하려면 super(). 멤버명으로 접근할 수 있다.

📍  부모 클래스의 인스턴스 멤버에는 당연히 접근 불가능.

📍  기능이 구현되어 있지 않은 빈껍데기 메서드를 추상 메서드라고 한다.

📍  추상 메서드를 가진 클래스를 상속한 자식 클래스는 반드시 추상 메서드를 구현해 주어야 한다.

📍  [참고] 파이썬을 갈고 닦자! : wikidocs.net/16073

 


👉  상속

class Greet() :
	greet = 'hello'
	introduce = 'My name is'

	def greeting(self) :
		print('Nice to Meet you')

	def print_info(self) :
		print(Greet.introduce,end=' ')

#상속하고자 하는 클래스명을 소괄호에 넣는다
class Profile(Greet) :
	def __init__(self, name) :
		self.name=name

#메인 루틴
if __name__ == '__main__' :
	s1 = Profile('jjangu')

	print(s1.greet) 	# hello
	s1.print_info()		# My name is jjangu
	s1.greeting()		# Nice to Meet you

✔  상속하고자 하는 부모 클래스의 이름을 클래스를 정의할 때 소괄호에 넣어준다.

✔  자식 클래스가 갖고 있지 않은 멤버라도 부모 클래스가 갖고 있다면 자식 클래스 객체를 통해 사용 가능하다.

✔  자식 클래스 Profile은 메서드 greeting, print_info를 가지고 있지 않지만 상속받았기에 사용할 수 있다.

 

👉 메서드 오버 라이딩과 super( )

class Greet() :
	greet = 'hello'
	introduce = 'My name is'

	def greeting(self) :
		print('Nice to Meet you')

	def print_info(self) :
		print(Greet.introduce,end=' ')

#상속하고자 하는 클래스명을 소괄호에 넣는다
class Profile(Greet) :
	def __init__(self, name) :
		self.name=name
        
   	#오버 라이딩 : 부모 클래스의 함수 재정의
	def print_info(self) :
		super().print_info()
		print('{}'.format(self.name))

#메인 루틴
if __name__ == '__main__' :
	s1 = Profile('jjangu')

	print(s1.greet) 	# hello
	s1.print_info()		# My name is jjangu
	s1.greeting()		# Nice to Meet you

✔  부모 클래스가 가진 메서드를 자식 클래스에서 재 정의하는 것을 오버 라이딩이라고 한다.

✔  재정의하기 전의 메서드를 자식 클래스 내부에서 사용하고 싶다면 super()를 사용한다.

✔  super()는 메서드뿐만 아니라 부모 클래스의 멤버에 접근할 수 있다.

class A :
	__a = 'a_private value'
	def __init__ (self, a) :
		self.a = a
	
	def print_instance(self) :
		print(self.a)
	
	def print_private(self) :
		print(A.__a)

class B(A) :
	def __init__(self, b):
		self.b = b

#main
aa = A('a_instance_value')
aa.print_instance()
aa.print_private()

bb = B('b_instance_value')
# bb.print_instance()	#Error
bb.print_private()

✔  클래스가 공유하지 못하는 인스턴스 변수에는 접근할 수 없다.

✔  즉, 인스턴스 변수를 사용하는 메서드는 오버 라이딩하거나 super()를 통해 사용할 수 없다.

 

✔  private 멤버 역시 클래스 내부에서만 사용할 수 있으므로 상속받을 수 없다.

✔  하지만 메서드를 간접 접근을 통해서는 사용할 수 있다. 그러므로 private 멤버를 사용하는 메서드는 사용할 수 있다.

 

👉  다중 상속

class A() :
	def func(self) :
		print('A')
class B() :
	def func(self) :
		print('B')

#다중 상속
class C(A,B) :
	def func(self) :
		#이 때 호출되는 함수는?
		super().func() 
		print('C')

if __name__ == '__main__' :
	c = C()
	c.func()

✔  다중 상속은 자식 클래스 하나가 여러 클래스로부터 상속받는 것을 의미한다.

✔  여러 개의 클래스를 콤마를 사용해 한번에 상속받을 수 있다.

✔  만약 같은 이름의 메서드를 가진 여러 클래스를 상속받았을 때, 어떤 메서드를 사용할까?

✔  그럴 때에는 먼저 상속한 부모 클래스의 메서드를 사용한다.

 

👉  추상 메서드와 추상 클래스

✔  추상 메서드 : 자식 클래스에서 오버 라이딩하도록 부모 클래스에서는 pass로 채워둔 메서드

✔  추상 클래스 : 미구현 추상 메서드를 하나 이상 가지는 클래스

from abc import ABCMeta
from abc import abstractmethod

class 추상클래스명(metaclass=ABCMeta):

	@abstractmethod
	def 추상메서드(self):
 		pass

class 자식클래스(추상클래스명) :
	def 추상메서드(self) :
    	print('상속받은 추상메서드 구현')

 

✔  추상 클래스를 만들기 위해서는 반드시 abc 모듈을 import 해야 한다.

✔ 추상 클래스의 소괄호에는 metaclass=ABCMeta를 넣어 추상 클래스임을 알리고

✔  메서드는 @abstractmethd를 사용해 추상 메서드임을 명시한다.

from abc import ABCMeta
from abc import abstractmethod

#추상 클래스
class Person(metaclass=ABCMeta) :	

	#추상 메서드
	@abstractmethod				
	def greeting(self) :
		pass

#추상 클래스를 상속하는 자식 클래스
class Profile(Person) :
	def greeting(self) :
		print('HELLO!')

#main 루틴
if __name__ =='__main__' :
	p = Profile()
	p.greeting()	#HELLO!

추상 클래스를 상속하고 추상 메서드를 구현하지 않으면 객체 생성 시 에러 발생

✔  추상 클래스를 상속받은 자식 클래스는 반드시 추상 메서드를 구현해야 한다.

✔  상속받은 추상 메서드를 구현하지 않으면 객체 생성 시 에러가 발생한다.

 

 

👉  mor( ) : 상속 관계를 확인하는 내장 함수

# 부모 클래스 : Person
# 자식 클래스 : Profile

print(Person.mro())
print(Profile.mro())

✔  내장 함수 mro( )을 사용해 클래스의 상속 관계를 확인할 수 있다.

✔  object 클래스는 모든 클래스의 최상위 클래스로, 모든 클래스가 object를 상속한다.

✔  객체가 아닌 클래스명에 직접 사용하니 주의하자.

 

 

 

 

 

[참고] 엘리스 트랙-혼자 공부하는 파이썬 / 길벗-파이썬 코딩 도장 / 엘리스 트랙 - 예제 중심의 파이썬 입문 / 위키백과

댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday