[python] Instance method, Static method, Class method

sing sang song·2021년 12월 27일
0

PYTHON

목록 보기
5/7
post-thumbnail

INSTANCE METHOD

인스턴스 변수에 엑세스할 수 있도록 첫 번째 인자에 항상 객체 자신을 의미하는 self파라미터를 갖는다.

  • 해당 메서드를 호출한 객체에만 영향을 미친다.

  • 객체 속성에 접근이 가능하다.

호출 방법

  • 해당 클래스 안 : self.메서드명
  • 클래스 밖 : 객체.메서드명

예시 코드

class Test:
    def __init__(self, name, age):
        self.name = name
        self.age  = age

    def print_info(self):
        print(self.name, ',', self.age) #1

    def test_func(self):
        self.print_info() 

test1 = Test('song', 30)
test1.print_info() #2 결과값 : song , 30 
test1.test_func()  #3 결과값 : song , 30

위 코드에서 print_info(), test_func() 가 인스턴스 메서드에 해당한다.
#1 => 메서드 안에서 메서드를 호출 할 때는 self.메서드() 형식으로 호출한다.
#2, #3 => 클래스 밖에서는 객체.메서드명 형식으로 호출

STATIC METHOD(정적 메서드)

객체와 독립적이지만, 로직상 클래스 내에 포함되는 메서드이다.

  • self파라미터를 가지고 있지 않다. 따라서, 인스턴스 변수에 액세스가 불가능하다.
    그러나, 정적 메서드 내부에서 클래스 변수(속성) 에는 클래스명.클래스속성명으로 엑세스가 가능하다.
  • 정적 메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(pure function)를 만들 때 사용한다.
  • 순수 함수란 부수 효과(side effect)가 없고, 입력 값이 같으면 언제나 같은 출력값을 반환한다.
    즉, 인스턴스 상태를 변화시키지 않는 메서드를 만들 때 사용한다.
  • @staticmethod라는 데코레이터를 붙여서 해당 메서드가 정적 메서드임을 표시한다.

호출 방법

  • 클래스명.정적메서드명 또는 객체명.정적메서드명 둘 다 호출 가능
  • ❗️전자를 주로 사용한다.

예시코드

class Calc:

    count = 10 # 클래스 변수(클래스 속성)

    @staticmethod
    def add(a):
        print(a + Calc.count) # 클래스 속성에는 엑세스가 가능하다.

    @staticmethod
    def mul(a):
        print(a * Calc.count)

Calc.add(15) # 결과값 :25 
Calc.mul(15) # 결과값 : 150

CLASS METHOD

인스턴스 없이 호출이 가능하다는 점에서 정적 메서드와 비슷하지만 약간의 차이점이 있다.

  • self파라미터 대신 cls라는 클래스를 의미하는 파라미터를 갖는다.
    해당 클래스로 생성된 객체로 부터 호출 되는 것이 아니라, 클래스 자체에서 직접 호출된다.
  • 객체의 속성/메서드에는 엑세스가 불가능하다.
    그러나, cls.클래스속성명으로 클래스 속성에는 접근 가능하다.
  • cls를 사용하면 클레스 메서드 내부에서 현재 클래스의 인스턴스를 만들 수도 있다. (cls() = 현재클래스명() 를 의미. 아래 예시 코드로 확인)
  • @classmethod라는 데코레이터를 붙여 해당 메서드가 클래스 메서드임을 표시한다.

호출 방법

  • 클래스명.클래스메서드명 또는 객체명.클래스메서드명 둘다 호출 가능

예시코드

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

    def __init__(self):
        Person.count += 1

    @classmethod
    def print_count(cls):
        print('{0}명 생성되었습니다.'.format(cls.count)) # 클래스 속성에는 엑세스가 가능하다.

    @classmethod
    def create(cls):
        p = cls() # 메서드 내부에서 cls()로 현재 클래스의 인스턴스를 만들 수도 있다. 즉, cls() = Person()을 의미한다.
        return p    

ryan = Person()
apeach = Person()

Person.print_count() # 결과값 : 2명 생성되었습니다.
print(Person.create()) # 결과값 : <__main__.Person object at 0x000001BA0AE143D0> Person클래스로 부터 생성된 인스턴스임을 확인할 수 있다.

STATIC METHOD vs CLASS METHOD

class method 코드

class Figure:
    @classmethod
    def set_name(cls, name):
        cls.name = name

# Figure 클래스를 상속받음
class Circle(Figure):
    pass


Figure.set_name("figure")
print(Figure.name, Circle.name) # 결과값 : figure figure

Circle.set_name("circle")
print(Figure.name, Circle.name) # 결과값 : figure circle

static method 코드

class Figure:
    @staticmethod
    def set_name(name):
        Figure.name = name

# Figure 클래스를 상속받음
class Circle(Figure):
    pass


Figure.set_name("figure")
print(Figure.name, Circle.name) # 결과값 : figure figure

Circle.set_name("circle")
print(Figure.name, Circle.name) # 결과값 : circle circle

Reference
kwonky티스토리
journeytosth티스토리

profile
세상을 선명하게

0개의 댓글