문제

그래서 저는 코드가 아마도 내가 말로 할 수있는 것보다 더 잘하려고하는 일을 설명 할 것이라고 생각합니다.

import abc

class foo(object):
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def bar(self):
        pass


class bar_for_foo_mixin(object):
    def bar(self):
        print "This should satisfy the abstract method requirement"


class myfoo(foo, bar_for_foo_mixin):
    def __init__(self):
        print "myfoo __init__ called"
        self.bar()

obj = myfoo()

결과:

TypeError: Can't instantiate abstract class myfoo with abstract methods bar

나는 믹스 인 클래스가 초록/인터페이스 클래스의 요구 사항을 충족시키기 위해 노력하고 있습니다. 내가 무엇을 놓치고 있습니까?

도움이 되었습니까?

해결책

상속이 다른 방향이되어서는 안됩니까? MRO에서 foo 현재 전에 온다 bar_for_foo_mixin, 그리고 정당하게 불평합니다. 와 함께 class myfoo(bar_for_foo_mixin, foo) 작동해야합니다.

그리고 당신의 수업 디자인이 올바른 방법인지 확실하지 않습니다. 구현을 위해 Mixin을 사용하기 때문에 bar foo에서 파생하지 않고 'foo'클래스에 등록하는 것이 더 낫습니다 (예 : foo.register(myfoo)). 그러나 이것은 단지 내 직감입니다.

완전성을 위해 여기에 있습니다 ABC에 대한 문서.

다른 팁

베이스 클래스를 역전시키는 것이 효과가 있다고 생각합니다.

class myfoo(bar_for_foo_mixin, foo):
    def __init__(self):
        print "myfoo __init__ called"
        self.bar()

따라서 mro ()에서는 초록을 찾기 전에 Bar ()의 구체적인 버전을 찾을 수 있습니다. 이것이 실제로 백그라운드에서 일어나는 일인지 전혀 모른다.

건배, 라스

추신 : Python 2.7에서 작동 한 코드는 다음과 같습니다.

class A(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def do(self):
        pass

class B(object):
    def do(self):
        print "do"

class C(B, A):
    pass

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