Language/Python

Python Class : @staticmethod, @classmethod

Hoplin 2019. 1. 18. 14:40
반응형

클래스 안에는 우리가 함수들을 여러개 선언하여 클래스라는 객체를 생성하고 인스턴스를 생성해 사용한다.

여기서 우리가 클래스 안에 내장된 함수들을 흔히 '메소드'라고 하는데 일반적으로 우리 인스턴스 메소드라 하는것은 개별적으로 동작하는 함수들을 생성하고자 할 때 사용한다. 인스턴스 함수는 일반적인 클래스에서 봤듯이 첫번째 인자로는 인스턴스를 가리키는 self가 들어가고 그 다음 인자들을 받는다. 밑의 코드에서의 __init__과 graduate과 같은 함수들이 일반적으로 흔히 말하는 인스턴스 메소드이다.


1
2
3
4
5
6
7
8
9
class school():
    count = 0
    def __init__(self,ID,age): #초기화함수 __init__또한 인스턴스 메서드이다.
        self.ID = ID
        self.age = age
        school.count += 1
        print("현재 등록된 학생 수 : {}".format(school.count))
    def graduate(self,graduate):#이러한 일반적인 메서드들을 인스턴스 메서드라고 한다.
        self.graduate = graduate
cs

하지만 이러한 인스턴스 메소드 외에도 두가지가 더 존재한다. 바로 정적 메소드와 클래스 메소드이다.

1 . 정적 메소드

정적 메소드란 클래스 안에 존재는 하지만 클래스의 인스턴스와는 무관하게 독립적으로 동작하는 함수들을 말한다. 정적메서드는 인자로서 인스턴스를 가리키는 self를 사용하지 않으며, 정적 메서드 안에서는 클래스 및 클래스 변수 접근이 불가능하다.  정적메소드를 선언하기 위해서는 정적 메소드를 선언하기 위한 def앞에 데코레이터인 @staticmethod를 적어준다. 정적 메소드를 선언할떄는 다음과 같은 형식으로 메소드를 선언해 준다

형식 : def (메소드명) (인자):

또한 정적 메소드는 객체를 생성하지 않고 클래스 명을 이용하여 메소드를 호출한다.

형식 : (클래스명).(메서드명)(인자)

정적 메서드는 주로 객체와 관계없이 동작하는 독립적인 기능을 해야하는 부분에 대해 주로 이용한다.


1
2
3
4
5
6
7
8
9
10
class school1(school):#위의 school클래스 상속
    
    @staticmethod
    def score(score):
        if(score >= 80):
            print("A입니다")
        elif(score < 80 and score >= 60):
            print("B입니다")
        else:
            print("C입니다")
cs

해당 코드에서 정적 메소드를 이용해 값을 출력하려면 밑의 사진과 같이 (클래스명).(메소드명)(인자) 순서로 작성하여 출력하면 된다.


2 . 클래스 메소드


클래스 메소드란 클래스 변수를 사용하기 위해 생성되는 메소드(및 함수)이다. 클래스 메소드는 메소드를 정의할때 첫 번째 인자로 일반적인 인스턴스 함수에서는 self라는 인스턴스 자체를 가리키는 매개변수를 썼지만 클래스 메소드에서는 클래스를 의미하는 cls라는 인자를 받고 cls를 이용해 클래스에 접근한다. 정적 메소드에서는 선언시 데코레이터 @staticmethod를 작성해 주었지만 클래스 메소드를 위해서는 데코레이터 @classmethod를 작성해 주어야 한다. 클래스 메소드의 형식은 다음과 같다.


형식 : def (클래스명)(cls,(인자들))


또한 정적 메소드에서도 봤듯이 클래스 메소드 역시 객체가 아닌 클래스명을 이용한 호출을 한다. 호출 형식인 다음과 같다


형식 : (클래스명).(메소드명)(인자)


클래스 메소드는 주로 생성된 객체 수 반환과 같이 클래스 자체에 대해 관리해야할 기능이 있는 경우 사용한다.


1
2
3
4
5
6
7
8
9
10
11
class test():
    count1 = 0
    def __init__(self,num):
        self.num = num
        test.count1 += 1
    @staticmethod
    def qw(num):
        print("입력값 : {0}".format(num))
    @classmethod
    def count(cls):
        print("현재 생성된 객체 수 {}".format(cls.count1))
cs

밑의 @classmethod 데코레이터를 이용한 클래스 메소드를 살펴보자. 우선적으로 첫번째 인자를 앞에서 말했듯이 클래스에 접근이 가능한 cls를 인자로 넣어주었다. 그 후 cls로 클래스에 접근을 하고 해당 클래스의 클래스 변수인 count1을 cls.count1 형식으로 클래스 변수에 접근하는것을 볼 수 있다.

여기서 클래스 변수에 대해 살펴보자면 클래스 변수는 주로 메소드들을 선언해 주기 전에 클래스 변수를 선언해 준 후 사용한다. 클래스 변수는 인스턴스가 달라도 주소값을 공유하는 성질이 있다. 그래서 인스턴스가 여러개여도 동일한 클래스 변수에 대해서는 값을 공유한다.


다음 코드는 해당 코드에 대한 클래스 메소드를 이용한 출력이다. 총 4개의 인스턴스를 생성하고 나서 클래스명인 test로 class메소드 count를 호출하여 생성된 총 객체수를 출력하는것을 볼 수 있다.














반응형