programing

Python에서 기본 클래스의 클래스 메서드 호출

lastmoon 2023. 7. 21. 21:51
반응형

Python에서 기본 클래스의 클래스 메서드 호출

다음 코드를 고려합니다.

class Base(object):

    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do(a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

> $ python play.py  
> In derived! 
> <class '__main__.Base'> msg

부터Derived.do어떻게 부를까요?Base.do?

일반적으로 사용합니다.super또는 일반 객체 메서드인 경우 기본 클래스 이름을 직접 호출할 수도 있지만, 기본 클래스에서 클래스 메서드를 호출하는 방법을 찾을 수 없습니다.

위의 예에서,Base.do(a)인쇄물Base대신 수업을 하다Derived학급.

새로운 스타일 클래스를 사용하는 경우(즉, 에서 파생됨)objectPython 2 또는 항상 Python 3)에서 수행할 수 있습니다.super()다음과 같이:

super(Derived, cls).do(a)

이렇게 하면 기본 클래스의 메서드 버전에서 코드를 호출할 수 있습니다(예:print cls, a), 파생 클래스에서, 사용cls파생 클래스로 설정됩니다.

꽤 시간이 흘렀지만 답을 찾은 것 같아요메서드를 클래스 메서드로 장식하면 원래 바인딩되지 않은 메서드가 'im_func'라는 속성에 저장됩니다.

class Base(object):
    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do.im_func(cls, a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

@David Z의 답변을 기반으로 다음을 사용합니다.

super(Derived, cls).do(a)

다음과 같이 더욱 단순화할 수 있습니다.

super(cls, cls).do(a)

저는 종종 수업 방법을 사용하여 객체를 구성하는 대안적인 방법을 제공합니다.아래 예제에서는 객체가 생성되는 방식을 변경하는 클래스 메소드 로드에 대해 위와 같은 슈퍼 함수를 사용합니다.

class Base():
    
    def __init__(self,a):
        self.a = a
    
    @classmethod
    def load(cls,a):
        return cls(a=a)
    
class SubBase(Base): 

    @classmethod
    def load(cls,b):
        a = b-1
        return super(cls,cls).load(a=a)
    
base = Base.load(a=1)
print(base)
print(base.a)

sub = SubBase.load(b=3)
print(sub)
print(sub.a)

출력:

<__main__.Base object at 0x128E48B0>
1
<__main__.SubBase object at 0x128E4710>
2

이것은 나에게 도움이 됩니다.

Base.do('hi')

언급URL : https://stackoverflow.com/questions/1269217/calling-a-base-classs-classmethod-in-python

반응형