Python

Python(13) 클래스 심화

UserDonghu 2023. 9. 19. 17:07

클래스 메서드

클래스에 작용하는 메서드

인자를 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