안녕하세요. TDR입니다.
오늘은 1부에 이어 비공개, 정적 , 클래스 메소드에 대해서 간략히 정리해 보겠습니다.
Private method(비공개 메소드)
class SomeClass:
def __init__(self):
pass
def public_method(self):
print('Public method!')
self.__private_method()
def __private_method(self):
print('Private method!')
class_obj = SomeClass()
# Public method!
# Private method!
class_obj.public_method()
class_obj.__private_method() # AttributeError
1부에서 살펴본 private attribute와 마찬가지로 class 내부의 함수 이름 앞에 __를 붙임으로 함수의 접근제한자를 private으로 설정할 수 있습니다. 그래서 위 예시와 같이 class 내부에서는 접근이 가능하지만 외부에서는 접근이 불가한 것을 볼 수 있습니다.
Static method(정적 메소드)
class SomeClass:
def __init__(self):
pass
@staticmethod
def static_method(a, b):
return a * a + b
print(SomeClass.static_method(2, 4)) # 8
static 메소드를 선언할 때는 일반적인 함수와 다른 점이 몇군데 있습니다. 하나는 해당 함수에 @staticmethod라는 decorator가 붙는 다는 것입니다. 그리고 매개변수에 self가 없는 것을 볼 수 있습니다. 이는 static 메소드 자체가 인스턴스 자체에 영향을 주지 않는 함수이기 때문입니다. 다른 언어에서도 Calc.sum(a, b)과 같이 인스턴스 생성 없이 class에 구현된 정적 메소드를 사용하는 것을 많이 볼 수 있습니다.
Class method(클래스 메소드)
class SomeClass:
__name = ''
def __init__(self, name):
SomeClass.__name = name
@classmethod
def class_method(cls):
return cls.__name
@classmethod
def set_class_method(cls, name):
cls.__name = name
return cls.__name
instance01 = SomeClass('John')
print(SomeClass.class_method()) # John
instance02 = SomeClass('Mike')
print(SomeClass.class_method()) # Mike
SomeClass.set_class_method('Carry')
print(SomeClass.class_method()) # Carry
class 메소드는 static 메소드와 유사해 보이지만 구문의 차이, 사용 목적의 차이가 있습니다. static 메소드는 class의 상태와 무관하게 사용할 수 있는 반면, class 메소드는 class 내부의 attribute나 함수에 접근하고 이용, 수정할 수 있습니다.
그리고 @classmethod decorator가 붙은 함수의 매개변수를 잘 보시면 self가 아닌 cls라는 값이 있는 것을 볼 수 있습니다. class 메소드는 instance가 아닌 class 자체에 접근을 하는 것이기 때문에 그렇습니다. 그리고 __init__ 함수를 보면 클래스 자체의 __name 값에 생성자로 전달된 값을 넣고 있습니다. 이것도 좀 전에 설명한 것처럼 class 자체 영역의 __name을 수정한다는 것을 알 수 있습니다.
설명을 따로 안한 Decorator라는 것은 추후 정리를 하겠습니다.
다음 3부에서는 클래스 상속, 추상 클래스 등을 정리해 보겠습니다.
'Computer & Program > python' 카테고리의 다른 글
[python] try-except (예외처리) (0) | 2024.02.27 |
---|---|
[python] class(클래스) - 03 (0) | 2024.02.26 |
[python] class(클래스) - 01 (0) | 2024.02.24 |
[python] 지역변수 & 전역변수 (0) | 2024.02.23 |
[python] function(함수) - 02 (0) | 2024.02.22 |
댓글