[python] 클래스 속성과 정적/클래스 메소드

anjiyoo·2024년 3월 6일

Python

목록 보기
34/41
post-thumbnail

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명 생성되었습니다
profile
기록으로 흔적을 남기는 것을 좋아합니다

0개의 댓글