추상 클래스 + Mixin + Python의 다중 상속
-
05-07-2019 - |
문제
그래서 저는 코드가 아마도 내가 말로 할 수있는 것보다 더 잘하려고하는 일을 설명 할 것이라고 생각합니다.
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()
제휴하지 않습니다 StackOverflow