문제

하위 클래스에 'classmethod' 메소드가 있는 상위 클래스의 메소드가 있는 하위 클래스를 만들고 싶지만 ~ 아니다 부모 클래스에서.

본질적으로 나는 다음을 달성하려고 노력하고 있습니다.

class foo(Object):
    def meth1(self, val):
        self.value = val

class bar(foo):
    meth1 = classmethod(foo.meth1)
도움이 되었습니까?

해결책

나는 또한 당신이 원하는 정확한 동작이 무엇인지 완전히 확신하지 못하지만 bar.meth1(42)가 foo.meth1이 bar의 클래스 메서드("self"가 클래스임)인 것과 동일하다고 가정하면 다음과 같습니다. 다음을 사용하여 이를 달성할 수 있습니다.

def convert_to_classmethod(method):
    return classmethod(method.im_func)

class bar(foo):
    meth1 = convert_to_classmethod(foo.meth1)

classmethod(foo.meth1)의 문제점은 foo.meth1이 이미 첫 번째 매개변수에 대한 특별한 의미를 갖는 메소드로 변환되었다는 것입니다.이 작업을 실행 취소하고 기본 함수 개체를 살펴보고 "self"가 의미하는 바를 재해석해야 합니다.

또한 이는 매우 이상한 일이므로 코드를 읽는 사람에게 혼란을 야기할 수 있다는 점을 경고하고 싶습니다.문제에 대한 다른 해결책을 생각해 보는 것이 더 나을 것입니다.

다른 팁

무엇을 성취하려고 하시나요?라이브 Python 코드에서 그러한 구성을 본다면 원래 프로그래머를 이길 것을 고려할 것입니다.

제기된 질문은 나에게 매우 이상해 보입니다.왜 누군가가 그렇게하고 싶어하는지 알 수 없습니다.Python에서 "클래스 메서드"가 무엇인지 오해하고 있을 가능성이 있습니다(Java의 정적 메서드와는 약간 다릅니다).

일반적인 메소드는 클래스의 인스턴스인 첫 번째 인수(보통 "self"라고 함)를 취하고 "."으로 호출되는 함수에 불과합니다.

클래스 메서드는 첫 번째 인수(흔히 "cls"라고 함)로 클래스를 취하고 ""로 호출할 수 있는 함수일 뿐입니다." 또는 "."로 입력합니다.

이를 염두에 두고 위에 표시된 코드를 사용하여 누군가 bar 인스턴스를 생성하고 이에 대해 meth1을 호출하면 어떤 일이 발생할 것으로 예상합니까?

bar1 = bar()
bar1.meth1("xyz")

meth1에 대한 코드가 호출되면 'self'와 'val'이라는 두 개의 인수가 전달됩니다.'val'에는 "xyz"가 전달될 것으로 예상하지만 'self'에는 무엇이 전달될 것이라고 생각하시나요?bar1 인스턴스여야 합니까(이 경우 재정의가 필요하지 않음)?아니면 클래스 표시줄이어야 합니까(그렇다면 이 코드는 무엇을 합니까)?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top