본문 바로가기
파이썬

파이썬 이 코드에서 classmethod는 무엇을합니까?

by º기록 2021. 1. 3.
반응형

django.utils.tree.py에서 :

def _new_instance(cls, children=None, connector=None, negated=False):
        obj = Node(children, connector, negated)
        obj.__class__ = cls
        return obj
    _new_instance = classmethod(_new_instance)

이 코드 샘플에서 classmethod 가 무엇을하는지 모르겠습니다. 누군가 그것이 무엇을하고 어떻게 사용하는지 설명 할 수 있습니까?

 

해결 방법

 

classmethod 는 함수를 래핑하는 데코레이터이며 결과 객체를 클래스 또는 (동등하게) 인스턴스에서 호출 할 수 있습니다.

>>> class x(object):
...   def c1(*args): print 'c1', args
...   c1 = classmethod(c1)
...   @classmethod
...   def c2(*args): print 'c2', args
... 
>>> inst = x()
>>> x.c1()
c1 (<class '__main__.x'>,)
>>> x.c2()
c2 (<class '__main__.x'>,)
>>> inst.c1()
c1 (<class '__main__.x'>,)
>>> inst.c2()
c2 (<class '__main__.x'>,)

보시다시피 직접 정의하든 데코레이터 구문으로 정의하든 클래스 또는 인스턴스에서 호출하든 classmethod 는 항상 클래스를 첫 번째 인수로받습니다.

classmethod의 주요 용도 중 하나는 대체 생성자 를 정의하는 것입니다.

>>> class y(object):
...   def __init__(self, astring):
...     self.s = astring
...   @classmethod
...   def fromlist(cls, alist):
...     x = cls('')
...     x.s = ','.join(str(s) for s in alist)
...     return x
...   def __repr__(self):
...     return 'y(%r)' % self.s
...
>>> y1 = y('xx')
>>> y1
y('xx')
>>> y2 = y.fromlist(range(3))
>>> y2
y('0,1,2')

이제 y 를 하위 클래스로 지정하면 classmethod가 계속 작동합니다. 예 :

>>> class k(y):
...   def __repr__(self):
...     return 'k(%r)' % self.s.upper()
...
>>> k1 = k.fromlist(['za','bu'])
>>> k1
k('ZA,BU')

 

참조 페이지 https://stackoverflow.com/questions/1950414

 

 

반응형

댓글