1.클래스 속성과 인스턴스 속성
- 클래스 속성: 모든 인스턴스가 공유, 인스턴스 전체가 사용해야 하는 값을 저장
- 인스턴스 속성 : 인스턴스별로 독립적, 각 인스턴스가 값을 따로 저장
__init__ 메소드에서 만들었던 속성은 인스턴스 속성
1-1.클래스 속성 사용하기
- 클래스 속성은 클래스에 속해 있으며 모든 인스턴스를 공유
- 인스턴스 속성을 만들 때 :
__init__ 메소드 안에서 self. 속성에 값 할당
# 클래스 속성 생성
def 클래스이름:
def __init__(self):
self.속성 = 값 # 인스턴스 속성 만들기
def 메소드(self):
self.속성 # 인스턴스 속성에 접근
인스턴스 = 클래스() # 인스턴스(객체) 만들기
인스턴스.속성 # 인스턴스 속성에 접근
def 클래스이름:
속성 = 값 # 클래스 속성 만들기
def 메소드(self):
self.속성 # 클래스 속성에 접근
클래스.속성 # 클래스 속성에 접근
클래스.속성 # 클래스 속성에 접근
class Person:
bag = []
def put_bag(self, stuff):
Person.bag.append(stuff) # 클래스 이름으로 클래스속성에 접근
james = Person()
James.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(Person.bag)
1-2.속성, 메소드 이름 찾는 순서
- 속성, 메소드 이름을 찾을 때 인스턴스 -> 클래스 순으로 찾음
인스턴스.__dict__
클래스.__dict__
1-3.인스턴스 속성 사용하기
class Person:
def __init__(self):
self.bag = []
def put_bag(self, stuff):
self.bag.append(stuff)
james = Person()
james.put_bag('책') # 인스턴스 속성
maria = Person()
maria.put_bag('열쇠') # 인스턴스 속성
print(james.bag)
print(maria.bag)
1-4.비공개 클래스 속성 사용하기
def 클래스이름:
__속성 = 값 # 비공개 클래스 속성
def __init_-(self):
self.__속성 = 값 # 비공개 인스턴스 속성
class Knight:
__item_limt = 10 # 비공개 클래스 속성
def print_item_limit(self):
print(knight.__item_limit) # 클래스 안에서만 접근할 수 있음
x = knight()
x.print_item_limit() # 10
print(knight.__item_limit) # 클래스 바깥에서는 접근할 수 없음
1-5.클래스와 메소드의 독스트링 사용하기
- 함수와 마찬가지로 클래스와 메소드도 독스트링 사용 가능
- 클래스와 메소드를 만들 때 콜론 바로 다음줄에 """ """ 큰따옴표 세개 혹은 작은따옴표 세개로 문자열 입력
클래스.__doc__
클래스.메소드__doc__
인스턴스.메소드.__doc__
class Person:
'''사람 클래스 입니다.'''
def greeting(self):
""" 인사 메소드 입니다."""
print("Hello")
print(Person.__doc__) # 사람 클래스입니다
print(Person.greeting.__doc__) # 인사 메소드입니다
maria = Person()
print(maria.greeting.__doc__) # 인사 메소드입니다
2.정적 메소드 사용하기 static
- 인스턴스를 통하지 않고 클래스에서 바로 호출
- 정적 메소드에는 매개변수에 self 지정하지 않음
- 인스턴스 속성에 접근할 수 없음
- side effect가 없고 입력 값이 같으며 언제나 같은 출력 값을 반환할 때 사용
- 데코레이터 @ : 메소드(함수)에 추가 기능 구현할 때 사용
class 클래스이름:
@staticmethod # 정적 메소드 만들기
def 메소드(매개변수1, 매개변수2)
코드
class Calc:
@staticmethod
def add(a.b):
print(a+b)
@staticmethod
def mul(a.b):
print(a*b)
Calc.add(10,20) # 클래스에서 바로 메소드 호출
Calc.mul(10,20) # 클래스에서 바로 메소드 호출
3.클래스 메소드 사용하기
- 클래스 메소드는 첫 번째 매개변수에 cls를 지정해야 함
- 정적 메소드처럼 인스턴스 없이 호출할 수 있음
- 클래스 메소드는 메소드 안에서 클래스 속성, 클래스 메소드에 접근해야할 때 사용
class 클래스이름:
@classmethod # 클래스 메소드 만들기
def 메소드(cls, 매개변수1, 매개변수2):
코드
class Person:
count = 0 # 클래스 속성
def __init__(self):
Person.count += 1 # 인스턴스가 만들어질 때 클래스 속성 count에 1을 더함
@classmethod
def print_count(cls):
print('{0}명 생성되었습니다.'.format(cls.count)) # cls로 클래스 속성에 접근
james = Person()
maria = Person()
Person.print_count() # 2명 생성되었습니다