클래스 메서드
클래스에 작용하는 메서드
인자를 cls로 명명함.
class MyClass:
count = 0
# 이거 안붙이면 cls는 그냥 인스턴스 변수 됨
@classmethod
def increment(cls):
cls.count += 1
a = MyClass()
b = MyClass()
MyClass.increment()
print(MyClass.count) # 출력 : 1
a.count, b.count # 1 1
원래 클래스 메서드를 안썼을 때
class MyClass:
count = 0
def increment(self):
self.count += 1
a = MyClass()
b = MyClass()
# MyClass.increment() # error
a.increment()
print(a.count, b.count) # 1 0
a.increment()
print(a.count, b.count)# 2 0
정적 메서드
클래스나 인스턴스와는 독립적으로 작동.
class MyClass:
@staticmethod
def my_method(x, y): # 클래스에 접근하지 않음
return x + y
print(MyClass.my_method(5, 3)) # 출력: 8
속성 접근자
클래스의 메서드를 속성처럼 접근 가능
class Person:
def __init__(self, first_name, last_name):
self._first_name = first_name
self._last_name = last_name
@property # 메소드를 인스턴스 변수처럼 사용
def full_name(self):
return f'{self._first_name}{self._last_name}'
def namemul(self):
return self.full_name * 2
licat = Person('li', 'cat')
print(licat._first_name) # li
print(licat._last_name) # cat
print(licat.full_name) # licat
# print(licat.full_name()) 괄호 쓰면 Error
print(licat.namemul()) # licatlicat 클래스 내부에서도 인스턴스 변수처럼 취급
덕타이핑
객체의 타입은 상관치 않고 구현된 메서드로만 확인
class Duck:
def introduce(self):
print("꽥꽥!")
class Person:
def introduce(self):
print("안녕하세요!")
def introduce(obj): # 이런식으로 수정도 가능
print('인사시작')
obj.introduce()
print('인사끝')
duck = Duck()
person = Person()
introduce(duck)
introduce(person)
# 인사시작
# 꽥꽥!
# 인사끝
# 인사시작
# 안녕하세요!
# 인사끝
추상 클래스
서브클래스에서 반드시 구현해야 하는 메서드를 정의
abc 모듈의 ABC클래스와 abstractmethod 데코레이터 사용
from abc import ABC, abstractmethod
class Person(ABC): # ABC를 상속받고
@abstractmethod # abstractmethod라고 선언을 하면
def move(self):
pass
class Hero(Person): # 상속받은 자식에서 반드시 오버라이딩이 일어나야 한다.
def move(self):
print('날아다님')
ironman = Hero()
ironman.move() # 날아다님
인터페이스
Python에는 인터페이스라는 내장 키워드나 구조가 없음. 추상 클래스로 인터페이스처럼 동작하게 만들 수는 있음
from abc import ABC, abstractmethod
class MyInterface(ABC):
@abstractmethod
def method1(self):
pass
@abstractmethod
def method2(self):
pass
비공개 속성
파이썬에서 속성이나 메서드를 완전히 비공개로 만드는 것은 불가.
대신 비공개처럼 작동하게 하는 방법은 있음
class MyClass:
__a = 10 # 언더바 두개를 붙임 (네임 맹글링)
_a = 100 # 한개는 상관없음
b = 20
def __init__(self, c, d):
self.__c = c # 언더바 두개 : 네임 맹글링
self.d = d
# MyClass.__a # Error
test = MyClass(30, 40)
# test.__a # 무조건 접근 불가능하지는 않음
print(test._MyClass__a) # 이렇게 접근 가능 # 10
print(test._MyClass__c) # 30
'Python' 카테고리의 다른 글
Python(15) 예외 처리와 오류 관리 (0) | 2023.09.19 |
---|---|
Python(14) 모듈 (0) | 2023.09.19 |
Python(12) 클래스 (0) | 2023.09.17 |
Python(11) if, match, for, while 문 (0) | 2023.09.15 |
Python(10) 리스트 컴프리헨션, 삼항 연산자 (0) | 2023.09.13 |