# 앞서 클래스의 속성을 사용해봤는데,
# 속성에는 클래스 속성과 인스턴스 속성 두 가지 종류가 있다.
# __init__ 메소드에서 만들었던 속성은 인스턴스 속성이다.
# 이번에는 클래스 속성을 사용해보자.
# class 클래스이름:
# 속성 = 값
# 과 같이 클래스 속성을 만들 수 있다.
classPerson:bag=[]defput_bag(self,stuff):Person.bag.append(stuff)# self.bag.append(stuff) 이렇게 두 가지 방식으로 접근이 가능한데, 위의 방식이 좀 더 직관적이다.
james=Person()james.put_bag('book')maria=Person()maria.put_bag('key')print(james.bag)# ['책', '열쇠']
print(maria.bag)# ['책', '열쇠']
# Person 클래스로 인스턴스를 각각 만들어줬음에도 불구하고
# james와 maria의 bag에는 같은 요소가 들어가있다.
# 즉, 클래스 속성은 클래스에 속해 있으며 해당 클래스의 인스턴스 모두가 공유한다.
# 또한, 클래스 속성도 인스턴스 속성과 마찬가지로 이름 앞에 __ 를 붙이면 비공개 속성으로 만들 수 있다.
# 클래스와 메소드의 독스트링은 아래와 같은 방식으로 사용할 수 있다.
classPerson2:'''사람 클래스'''defgreeting(self):'''인사 메소드'''print('Hello')print(Person2.__doc__)# 사람 클래스
print(Person2.greeting.__doc__)# 인사 메소드
maria=Person2()print(maria.greeting.__doc__)# 인사 메소드
정적 메소드 사용하기
# 지금까지는 클래스의 메소드를 사용할 때 인스턴스를 통해 호출했다.
# 이번에는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 정적 메소드와 클래스 메소드에 대해 알아보자.
# 정적 메소드는 메소드 위에 @staticmethod를 붙인다.
# staticmethod 의 앞에 붙는 @ 를 데코레이터라고 하며 메소드(함수)에 추가 기능을 구현할 때 사용한다.
# 정적 메소드는 매개변수에 self를 지정하지 않는다.
# 정적 메소드는 self를 받지 않으므로 인스턴스 속성, 메소드에는 접근할 수 없다.
# 그래서 보통 정적 메소드는 인스턴스 속성, 인스턴스 메소드가 필요 없을 때와
# 인스턴스의 상태를 변화시키지 않고, 입력 값이 같으면 언제나 출력 값이 같은 순수 함수를 만들 때 사용한다.
classCalc:@staticmethoddefadd(a,b):print(a+b)@staticmethoddefmul(a,b):print(a*b)@staticmethoddefadd_mul(a,b):Calc.add(a,b)Calc.mul(a,b)# 정적 메소드는 다음과 같이 클래스에서 바로 메소드를 호출하면 된다.
Calc.add(1,2)# 3
Calc.mul(1,2)# 2
Calc.add_mul(3,4)# 7 12
클래스 메소드 사용하기
# 이번에는 정적 메소드와 비슷하지만 약간의 차이점이 있는 클래스 메소드를 사용해보자
# 클래스 메소드는 메소드 위에 @classmethod 를 붙인다.
# 클래스 메소드는 첫 번째 매개변수에 cls를 지정해야 한다.
# 클래스 메소드는 정적 메소드처럼 인스턴스 없이 호출할 수 있다는 점은 같지만,
# 클래스 메소드는 메소드 안에서 클래스 속성, 클래스 메소드에 접근해야 할 때 사용한다.
# 특히 cls를 사용하면 메소드 안에서 현재 클래스의 인스턴스를 만들 수 있다.
# cls는 클래스이므로 cls()는 Person()과 같다.
classPerson:count=0# 클래스 속성
def__init__(self):Person.count+=1# 인스턴스가 만들어질 때 클래스 속성 count에 1을 더한다.
@classmethoddefprint_count(cls):print('{0}명 생성되었습니다.'.format(cls.count))# cls로 클래스 속성에 접근
james=Person()maria=Person()Person.print_count()# 2명 생성되었습니다.
Leave a comment