alpyrithm_알파이리즘
Python 클래스(class) 공부 본문
참고 사이트 : 파이썬 코딩 도장
클래스 속성과 인스턴스 속성 알아보기
클래스 속성 사용하기
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 만 넣어서 빈 메서드로 만들었다.
- 추상 메서드는 인스턴스를 만들 수 없으므로 호출할 일이 없기에 빈 메서드로 만든다.
- 추상 클래스는 인스턴스로 만들 때는 사용하지 않고 상속에만 사용한다.
- 파생 클래스에서 반드시 구현해야 할 메서드를 정해줄 때만 사용한다.