반응형
클래스 변수
- 클래스에서 생성된 객체라도 서로 완전히 독립적이지만, 클래스 변수를 사용하면 같은 클래스에서 생성된 객체들끼리 정보를 공유할 수 있다.
>>> class Alphabets:
... __str = "" # 클래스 변수 선언
... def __init__(self, text):
... self.text = text
... Alphabets.__str += text
... def print_class_variable(self):
... print (Alphabets.__str) # 클래스 변수 사용
>>> if __name__ == '__main__':
... o1 = Alphabets('p') # 알파벳 클래스의 6개 객체 생성
... o2 = Alphabets('y')
... o3 = Alphabets('t')
... o4 = Alphabets('h')
... o5 = Alphabets('o')
... o6 = Alphabets('n')
... o1.print_class_variable()
... o5.print_class_variable()
python
python
클래스 메소드
- 클래스 메소드는 클래스의 데이터인 객체(Object)를 처리하는 동작 부분으로, 함수의 형태로 객체 내부에서 연산을 수행한다.
- 클래스 메소드는 해당 클래스의 객체에서만 호출이 가능하며, 멤버 함수라고도 한다.
# 객체명.메소드명()
a = list()
print(a.append(0))
메소드 오버라이딩
- 부모 클래스의 메소드를 동일한 이름으로 다시 만드는 것을 오버라이딩(overriding, 덮어쓰기)이라고 한다.
- 자식 클래스의 객체로 메소드를 호출하면 재정의된 메소드가 호출된다.
# FourCal 클래스 실행시 오류
>>> a = FourCal(4, 0)
>>> a.div()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
result = self.first / self.second
ZeroDivisionError: division by zero # 4를 0으로 나누려고 하기 때문에 오류
# 0으로 나눌 때 오류가 아닌 0을 리턴하도록 만들고 싶다면
>>> class SafeFourCal(FourCal): # FourCal클래스를 상속
... def div(self): # FourCal > div 메서드와 동일 이름
... if self.second == 0: # 나누는 값이 0이면 0을 리턴하도록 수정
... return 0
... else:
... return self.first / self.second
>>> a = SafeFourCal(4, 0)
>>> a.div()
0
클래스 메소드 종류
1. 객체 메소드(Instance Method)
- 객체 메소드는 클래스를 통해 생성한 객체에서 호출되는 메소드로, 해당 메소드를 통해 호출한 객체에서만 영향을 미친다.
- 객체 메소드는 객체 변수에 접근할 수 있도록 항상 첫번째 인자로 객체 자신을 뜻하는 self 매개변수를 넘겨받는다. self 인자를 통해 __init__에서 정의한 인스턴스 변수에 접근한다.
2. 정적 메소드(Static Method)
- 정적 메소드는 @staticmethod라는 데코레이터로 선언하며, 기본 인자로 넘어오는 것이 아무것도 없어 객체와 독립적이다.
- 보통 정적 메소드는 다른 외부 상태에 영향을 미치지 않는 순수 함수, 즉 입력 값이 같으면 언제나 출력값이 같은 용도로 사용된다.
3. 클래스 메소드(Class Method)
- 클래스 메소드는 @classmethod라는 데코레이터로 선언하며, 클래스로 생성된 객체가 아니라 클래스 자체에서 직접 호출된다.
- 그래서 객체의 속성이나 메서드에는 접근이 불가능하나, 클래스를 의미하는 cls라는 매개변수를 사용하면 클래스 메서드 내부에서 현재 클래스의 객체를 만들 수 있다.
- 객체 없이 호출이 가능하다는 점에서 정적 메서드와 비슷하고, self 매개 변수를 가진 객체 메서드처럼 cls 라는 매개 변수를 가진다.
객체 자신을 의미하는 self, 객체명.속성 = self.속성
현재 클래스를 의미하는 cls, cls() = 현재클래스명()
>>> class Test():
>>> age = 10 # 클래스 변수(속성)
>>>
>>> def __init__(self, name):
>>> self.name = name
>>>
>>> def say_hi(self): # 객체 메소드
>>> print(f"hi, {self.name}") # 클래스 내 호출법, self.메소드명
>>>
>>> @staticmethod # 정적 메소드
>>> def good_bye(): # 어디서 접근하든 똑같은 방식으로 실행
>>> print("bye bye")
>>>
>>> @classmethod # 클래스 메소드
>>> def greeting(cls): # 클래스 속성에 접근 가능
>>> print(f"{cls.age} years old")
>>> ppl = Test('jane')
>>> ppl.say_hi() # 객체 메서드 호출
hi, jane
>>> ppl.good_bye() # 정적 메서드 호출
bye bye
>>> ppl.greeting() # 클래스 메소드
10 years old
Reference
반응형
'Data > Python' 카테고리의 다른 글
[Python] 파이썬 객체 정보 은닉 - Public, Private, Protected (0) | 2023.06.17 |
---|---|
[Python] 파이썬 클래스 - 상속과 오버라이딩, super (0) | 2023.06.17 |
[Python] 파이썬 클래스 - 정의 및 생성자 (0) | 2023.06.17 |
[Python] 파이썬 입출력 - 파일 읽고 쓰기 (0) | 2023.06.17 |
[Python] 파이썬 입출력 - 사용자 입력과 출력 (0) | 2023.06.17 |