alpyrithm_알파이리즘

Python 클래스(class) 공부 본문

Algorithm

Python 클래스(class) 공부

알파이 2020. 7. 11. 12:27

참고 사이트 : 파이썬 코딩 도장

 

파이썬 코딩 도장: 35.1 클래스 속성과 인스턴스 속성 알아보기

Unit 35. 클래스 속성과 정적, 클래스 메서드 사용하기 지금까지 간단하게 클래스를 만들고 속성과 메서드를 사용해봤습니다. 이번에는 클래스에 속해 있는 클래스 속성에 대해 알아보겠습니다. �

dojang.io

 

 

 

 

클래스 속성과 인스턴스 속성 알아보기

 

클래스 속성 사용하기

 

class 클래스이름:
	속성 = 값

- 클래스 속성은 클래스에 속해 있으며 모든 인스턴스에서 공유한다.

 

  • 클래스 속성 : 모든 인스턴스가 공유, 인스턴스 전체가 사용해야 하는 값을 저장할 때 사용
  • 인스턴스 속성 : 인스턴스별로 독립되어 있음, 각 인스턴스가 값을 따로 저장해야 할 때 사용

 

 

 

 

 

 

 

 

 

 

정적 메서드 사용하기

 

- 클래스의 메서드를 사용할 때 인스턴스를 통해서 호출했다.

- 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 정적 메서드와 클래스 메서드

 

 

정적 메서드

- 메서드 위에 @staticmethod를 붙인다.

- 정적 메서드는 매개변수에 self를 지정하지 않는다.

class 클래스이름:
	@staticmethod
    	def 메서드(매개변수1, 매개변수2):
    		코드

 

  • @ : 데코레이터, 메서드(함수)에 추가 기능을 구현할 때 사용
  • 정적 메서드 호출
    • 클래스.메서드()
    • 클래스에서 바로 메서드를 호출하면 된다.
  • self를 받지 않으므로 인스턴스 속성에 접근할 수 없다.
  • 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용한다.
  • 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(pure function)를 만들 때 사용한다.
    • 순수 함수는 부수 효과(side effect)가 없고 입력 값이 같으면 언제나 같은 출력 값을 반환한다.
    • 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용

 

 

 

 

 

 

클래스 메서드 사용하기

 

- @classmethod를 붙인다.

- 클래스 메서드는 첫 번째 매개변수에 cls를 지정해야 한다.

 

class 클래스이름:
	@classmethod
    	def 매서드(cls, 매개변수1, 매개변수2):
    		코드

 

- 클래스 메서드도 정적 매서드처럼 인스턴스 없이 호출할 수 있다.

- 하지만 클래스 메서드는 메서드 안에서 클래서 속성, 클래서 메서드에 접근해야 할 때 사용한다.

 

 

 

 

 

 

 

 

 

클래스 상속(inheritance)

상속 : 무언가를 물려받는다는 뜻

- 클래스 상속 : 물려받은 기능을 유지한채로 다른 기능을 추가할 때 사용하는 기능

  • 기반 클래스(base class) : 기능을 물려주는 클래스
    • 부모 클래스(parent class)
    • 슈퍼 클래스(superclass)
  • 파생 클래스(derived class) : 상속을 받아 새롭게 만드는 클래스
    • 자식 클래스(child class)
    • 서브 클래스(subclass)

 

- class 파생클래스이름(기반클래스이름)

 

 

 

 

 

super()로 기반 클래스 초기화

- super().메서드()

- super().__init__()  으로 기반 클래스의 __init__ 메서드를 호출한다.

 

 

- 파생 클래서에서 __init__ 메서드를 생략한다면 기반 클래스의 __init__이 자동으로 호출되므로 super()는 사용하지 않아도 된다.

 

- super(파생클래스, self).__init__()  으로 기반 클래스의 메서드 호출

 

 

 

 

 

 

 

 

 

 

오버라이딩(overriding)

- 파생 클래스에서 기반 클래스의 메서드를 새로 정의하는 방법

- 중복되는 기능은 파생 클래스에서 다시 만들지 않고, 기반 클래스의 기능을 사용하면 된다.

- 메서드 오버라이딩은 원래 기능을 유지하면서 새로운 기능을 덧붙일 때 사용한다.

 

 

 

 

 

 

다중 상속

- 여러 기반 클래스로부터 상속을 받아서 파생 클래스를 만드는 방법

class 기반클래스이름1:
	코드
    
class 기반클래스이름2:
	코드
    
class 파생클래스이름(기반클래스이름1, 기반클래스이름2):
	코드

 

 

 

 

다이아몬드 상속

 

- 복잡한 클래스 상속

- 클래스 이름을 편의상 A, B, C, D로 만들자.

class A:
	def greeting(self):
    	print('안녕하세요. A입니다.')
        
class B(A):
	def greeting(self):
    	print('안녕하세요. B입니다.')

class C(A):
	def greeting(self):
    	print('안녕하세요. C입니다.')
        
class D(B, C):
	pass

x = D()
x.greeting()

# 안녕하세요. B입니다.

 

 

 

메서드 탐색 순서 확인하기

- 메서드 탐색 순서(Method Resolution Order, MRO) : 다이아몬드 상속 해결책

- 클래스 D에 메서드 mro를 사용해보면 메서드 탐색 순서가 나온다.

- 클래스.mro()

- 상속 관계가 복잡하게 얽혀 있다면 MRO를 살펴보면 편리하다.

 

 

 

 

 

* 파이썬 3에서는 class X(object):와 class X: 모두 클래스를 만드는 것이다. *

 

 

 

 

 

 

 

 

추상 클래스(abstract class)

- 메서드의 목록만 가진 클래스이며 상속받는 클래스에서 메서드 구현을 강제하기 위해 사용한다.

- import로 abc(abstract base class) 모듈을 가져와야 한다.

- 클래스의 () 안에 metaclass = ABCMeta를 지정하고, 메서드를 만들 때 위에 @abstractmethod를 붙여서 추상 메서드로 지정한다.

 

from abc import *

class 추상클래스이름(metaclass=ABCMeta):
	@abstractmethod
    	def 매서드이름(self):
    		코드

 

- import abc인 경우 abc.ABCMeta, @abc.abstractmethod로 사용해야 한다.

 

* 추상 클래스를 상속받았다면 @abstractmethod가 붙은 추상 메서드를 모두 구현해야 한다.

- 추상 클래스는 파생 클래스가 반드시 구현해야 하는 메서드를 정해줄 수 있따.

 

- 추상 클래스는 인스턴스로 만들 수 없다.

- 추상 메서드를 만들 때 pass 만 넣어서 빈 메서드로 만들었다.

  • 추상 메서드는 인스턴스를 만들 수 없으므로 호출할 일이 없기에 빈 메서드로 만든다.
  • 추상 클래스는 인스턴스로 만들 때는 사용하지 않고 상속에만 사용한다.
  • 파생 클래스에서 반드시 구현해야 할 메서드를 정해줄 때만 사용한다.

 

 

 

 

 

 

 

728x90
반응형
Comments