상속
상속: 기존 클래스(parent class, super class)의 내용(속성과 기능)을 자식 클래스가 물려받는 것
- class 자식클래스(부모클래스)로 선언
- 자식 클래스 객체는 .을 사용해 부모클래스의 속성과 메소드 사용가능
- 자식 클래스에서 오버라이딩한 메소드가 있을 때 부모클래스의 메소드 또한 사용하고 싶으면 super.메소드()를 통해 가능
- 자식클래스의 매개변수로 여러 개의 부모클래스를 받아오면 다중상속이 가능하다.
메소드 오버라이딩: 부모 클래스의 메소드를 자식클래스에서 재정의
*파이썬은 오버라이딩은 지원하지만 오버로딩(서로 다른 파라미터를 받는 것)은 지원하지 않는다.
클래스 메소드, 정적메서드
인스턴스 메소드: 가장 일반적인 메소드, 첫 번째 인자에 객체 자신을 의미하는 self를 파라미터로 받는다.
- 첫 인자의 객체 인스턴스 때문에 인스턴스를 생성하지 않고 메소드를 사용하기 위해 아래 두 메소드를 사용
클래스 메소드: @classmethod를 통해 선언. 객체 인스턴스를 수정할 수 없음. 클래스의 속성에 접근 가능
- cls() 메소드를 통해 생성자를 만들 수 있다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def add_new_member(cls, member_name, birthyear):
name = member_name
age = 2024 - birthyear
return cls(name, age)
person1 = Person("kim", 19)
person2 = Person.add_new_member("park", 2004)
print("{}의 나이는 {}살".format(person1.name, person1.age))
print("{}의 나이는 {}살".format(person2.name, person2.age))
- 각 인스턴스의 속성, 메소드엔 접근할 수 없지만 클래스 변수에 접근함으로써 각 인스턴스에서 공통적으로
접근하는 변수에 대해 일관된 변화를 적용할 수 있다.
정적 메소드: @staticmethod를 통해 선언. 인스턴스 상태를 변화시키지 않는 순수 함수를 만들 때 사용
- 위 두 메소드처럼 self나 cls같은 별도의 파라미터를 받지 않기 때문에 클래스에 영향을 미치지 않는다.
클래스 메소드와 정적 메소드는 상속에서 큰 차이점을 나타낸다.
클래스 메소드는 상속 시 메서드가 호출된 cls를 인자로 받기 때문에 해당 cls 클래스의 속성을 변경,
따라서 하위 클래스에서 호출 시 하위클래스의 속성을 변경
정적 메소드는 상속이 일어나도 클래스나 인스턴스와 독립적으로 동작하여 특정 클래스에 속하지 않기 때문에
선언된 클래스에서만 접근하고 상속받은 자식 클래스에서는 접근하지 않는다.
class Man:
@classmethod
def class_method(cls, name):
cls.name = name
@staticmethod
def static_method(name):
Man.name = name
class Member(Man):
pass
Man.class_method("Kim")
Member.class_method("Park")
print(Man.name, Member.name) #Kim Park
Man.static_method("Lee")
print(Man.name, Member.name) #Lee Park
Member.static_method("Hong")
print(Man.name, Member.name) #Lee Hong이 아니라 Lee Park
추상 클래스
추상 클래스: 미구현 추상 메소드를 한 개 이상 가지는 클래스
- 인스턴스화할 수 없다.
- 서브클래스들이 공통된 인터페이스를 구현할 수 있도록 인터페이스를 정의하는 역할(다형성에 일조)
- abc모듈을 import 해야 하며 'ABC'클래스와 '@abstractmethod' 데코레이션을 사용한다.
추상 클래스 선언 시 ABC클래스를 받아야 하고, 추상 메서드 선언 시 @abstractmethod 데코레이션을 사용
class Country(ABC):
@abstractmethod
def population(self):
pass
class Korea(Country):
def population(self):
print("인구수")
- 상속받은 서브클래스는 추상 메서드를 반드시 구현해야 하며 구현하지 않으면 객체 생성 시 오류 발생
- 추상 클래스는 인스턴스로 만들 수 없기 때문에 인터페이스만 잡아주면 돼서 빈 메서드로 만든다(pass).
참고 사이트
https://whatisand.github.io/python-staticmethod-classmethod/
'Lauguage > Python' 카테고리의 다른 글
[Python] 캡슐화 (0) | 2024.06.15 |
---|---|
[Python] 동시성 관리 (1) | 2024.06.15 |
[Python] GIL (Global Interpreter Lock) (0) | 2024.06.11 |
[Python] [혼자 공부하는 파이썬] Chapter 8. 클래스 (0) | 2024.06.10 |
[Python] [혼자 공부하는 파이썬] Chapter 6-7 예외처리, 모듈 (1) | 2024.06.08 |