(2023.2.14) Today_I_Learned_day-121

imRound·2023년 2월 14일
post-thumbnail

@staticmethod vs@classmethod

staticmethod

  • 부모 클래스에서 정의된 staticmethod는 자식 클래스에서 call 가능
  • 클래스 변수에는 접근이 가능
  • 생성자 포함하여 인스턴스 메소드 변수에는 접근 불가
# static mehtod
class hello_num:
    num = 10
    
    @staticmethod
    def calc(x):
        return x + 10 + hello_num.num

print(hello_num.calc(10))

classmehtod

  • 부모 클래스에서 정의된 클래스 변수와 클래스 메소드는 자식 클래스에서도 선언 가능
  • 클래스 변수에 접근이 가능한다.
  • 생성자 함수 포함 인스턴스 메소드 변수에 접근이 불가
  • classmehtod의 경우 cls 인자를 활용하여 클래스의 클래스 속성을 가져온다.
# class method
class hello_clsnum:
    num = 10
    
    @classmethod
    def calc(cls, x): # cls는 '클래스'를 가리킨다. (클래스의 어떤 속성에도 접근 O)
        return x + 10 + cls.num # cls.num을 통하여 class hello_clsnum 클래스의 num속성에 접근

print(hello_clsnum.calc(10))

차이점

  • 차이점으로는 클래스를 상속할 때 나누어진다.
  • staticmehtod
    • 부모, 자식 클래스 어디에서 선언하든 클래스 변수를 모두 바꾼다.
  • classmethod
    • 부모 클래스 객체에서 선언해야지만 자식 클래스의 클래스 변수까지 모두 바꿀 수 있다.
class Person:
    default= "아빠"

    def __init__(self):
        self.data = self.default

    @classmethod
    def class_person(cls):
        return cls()

    @staticmethod
    def static_person():
        return Person()

class WhatPerson(Person):
    default = "엄마"
# classmethod의 경우 현재 클래스의 클래스 속성을 가져온다.
person1 = WhatPerson.class_person()    # return 엄마
# staticmethod의 경우 부모 클래스의 클래스 속성 값을 가져온다.
person2 = WhatPerson.static_person()   # return 아빠
profile
Django 개발자

0개의 댓글