반응형
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
학급.
새로운 스타일 클래스를 사용하는 경우(즉, 에서 파생됨)object
Python 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
반응형
'programing' 카테고리의 다른 글
@FacesComponent가 있는 JSF 사용자 지정 구성 요소를 SpringBoot에서 찾을 수 없습니다. (0) | 2023.07.21 |
---|---|
데이터 프레임을 사전으로 변환하는 방법 (0) | 2023.07.21 |
git 하위 디렉토리에서 pip을 사용하여 설치하려면 어떻게 해야 합니까? (0) | 2023.07.21 |
성능 - 스프링 부팅 - 서버 응답 시간 (0) | 2023.07.21 |
오라클에 내장된 해시 기능이 있습니까? (0) | 2023.07.21 |