파이썬 클래스 속성, 인스턴스 속성, 정적 메서드와 클래스 메서드

Yeonu·2020년 11월 24일
0

Python 이론

목록 보기
21/30
post-thumbnail
post-custom-banner

클래스 속성

클래스에 바로 속성을 만든다.

class 클래스이름:
   속성 = 값

# ex    
class Person:
 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) 

# 실행 결과
['책', '열쇠']
['책', '열쇠']

클래스 속성은 클래스에 속해 있으며 모든 인스턴스에서 공유한다.

인스턴스 속성

속성을 공유하고 싶지 않다면 인스턴스 속성으로 만들면 된다.

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)

# 실행 결과
['책']
['열쇠']



비공개 클래스 속성 사용하기

클래스 안에서만 접근할 수 있고, 클래스 바깥에서는 접근할 수 없다.

class 클래스이름:
   __속성 = 값    # 비공개 클래스 속성
   
#ex
class Knight:
 __item_limit = 10    # 비공개 클래스 속성

 def print_item_limit(self):
     print(Knight.__item_limit)    # 클래스 안에서만 접근할 수 있음
     

x = Knight()
x.print_item_limit()    # 10

print(Knight.__item_limit)    # 클래스 바깥에서는 접근할 수 없음
   



정적 메서드 사용하기

인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있다.
메서드 위에 @staticmethod를 붙인다. 이때 정적 메서드는 매개변수에 self를 지정하지 않는다.

class 클래스이름:
    @staticmethod
    def 메서드(매개변수1, 매개변수2):
        코드

 # ex
 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)    # 클래스에서 바로 메서드 호출

# 실행 결과
30
200

정적 메서드를 호출할 때는 아래와 같이 클래스에서 바로 메서드를 호출한다.
클래스.메서드()

정적 메서드는 self를 받지 않으므로 인스턴스 속성에는 접근할 수 없다. 그래서 보통 정적 메서드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 즉, 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용한다.



클래스 메서드 사용하기

클래스 메서드는 정적 메서드처럼 인스턴스 없이 호출할 수 있다는 점은 같다. 하지만 클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용한다.
클래스 메서드는 다음과 같이 메서드 위에 @classmethod를 붙인다. 이때 클래스 메서드는 첫 번째 매개변수에 cls를 지정해야 한다.

class 클래스이름:
    @classmethod
    def 메서드(cls, 매개변수1, 매개변수2):
        코드

#ex) 클래스 Person을 만들고 인스턴스가 몇 개 만들어졌는지 출력하는 메서드를 만든다.

class Person:
    count = 0    # 클래스 속성

    def __init__(self):
        Person.count += 1    # 인스턴스가 만들어질 때
                             # 클래스 속성 count에 1을 더함
		
     # 클래스 메서드는 첫 번째 매개변수가 cls인데 여기에는 현재 클래스가 들어온다. 
     # 따라서 cls.count처럼 cls로 클래스 속성 count에 접근할 수 있다. 
    @classmethod
    def print_count(cls):
        print('{0}명 생성되었습니다.'.format(cls.count))    # cls로 클래스 속성에 접근

james = Person()
maria = Person()

Person.print_count()    # 2명 생성되었습니다

# 실행 결과
2명 생성되었습니다.

cls를 사용하면 메서드 안에서 현재 클래스의 인스턴스를 만들 수도 있다. 즉, cls는 클래스이므로 cls()는 Person()과 같다.

  @classmethod
    def create(cls):
        p = cls()    # cls()로 인스턴스 생성
        return p




출처, 강의
💡 35.1
💡 35.2
💡 35.3

post-custom-banner

0개의 댓글