[Python] 클래스 속성과 정적, 클래스 메소드 사용하기

    Class를 생성하고 나서 사용 할 때.

     

    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)
    

    >>>['책', '열쇠']

    >>>['책', '열쇠']

     

     

    클래스 속성은 클래스에 속해 있으면 모든 인스턴스에서 공유한다. 그래서 클래스 속성에 접근 할 때 명칭은

    self를 사용하기엔 좀 아쉽다.

     

    class Person:
    	bag = []
        
        def put_bag(self, stuff):
        	Person.bag.append(stuff)

    Person.bag 라고 하니 클래스 Person에 속한 bag 속성이라는 것을 바로 알 수 있다.

    마찬가지로 클래스 바깥에서도 다음과 같이 클래스 이름으로 클래스 속성에 접근하면 된다.

     

    이는 어차피 bag는 공유의 성질을 갖고 있어서 self보다는 Person이라는 class 이름을 줘서

    공유하고 있다는 것을 코드를 살펴보는 사람에게 명확하게 암시를 해준다.

     

     

     

    인스턴스 속성 사용하기

    그렇다면, 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)
    

    >>>['책']

    >>>['열쇠']

     

    인스턴스 속성으로 만들면 된다.

    인스턴스 속성은 인스턴스별로 독립되어 있어서 서로의 영향을 줄 수가 없다.

     

    따라서 변수를 __init__(self) (생성자)에 생성함으로써 코드의 독립을 만들어 준다.

     

     

     

    정적 메서드 사용하기

    @Staticmethod
    def 메서드(매개변수)
    	코드

    @staticmethod처럼 @이 붙은 것을 데코레이터라고 하며 메서드 (함수)에 추가 기능을 구현 할 때 사용한다.

     

    이는 메서드를 사용 할 때 기본적으로 class를 불러오지만, class를 불러오지 않고 곧 바로 사용 할 수 있게 해준다.

     

     

    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

     

    클래스 이름을 붙이고 바로 메서드를 사용해서 불러오는 것을 확인 할 수가 있다.

     

     

    클래스 메서드 사용하기

    정적 메서드와 비슷하지만 약간의 차이점이 있다. <<= 포인트

    메서드 위에 @classmethod를 붙인다.

    첫 번째 매개변수는 self가 아닌 cls가 들어간다.(cls는 class의 줄임말이다.)

    class Person:
        count = 0
    
        def __init__(self):
            Person.count += 1
    
            
        @classmethod
        def print_count(cls):
            print('{0}명 생성되었습니다. '.format(cls.count))
    
    james = Person()
    maria = Person()
    
    Person.print_count()
    

    >>> 2명 생성되었습니다.

     

     

    @staticmethod가 있어서 똑같이 이가 static인지 아닌지 구분할 필요가 생겼다.

    그래서 classmethod를 줘서 얘가 static이 아니라는 것을 암시 해준다.

     

     

     

    반응형

    'Language > Python' 카테고리의 다른 글

    [Python] 예외처리하기  (0) 2020.10.19
    [Python] 클래스 상속하기  (0) 2020.10.16
    [Python] 클래스 사용하기  (0) 2020.10.16
    [Python] 변수의 사용범위 알아보기  (0) 2020.10.15
    [Python] 람다 표현식 사용하기  (0) 2020.10.15

    댓글

    Designed by JB FACTORY