#python #abstract-class #multiple-inheritance #mixins
#python #абстрактный класс #множественное наследование #микширование
Вопрос:
Я пытаюсь наследовать как абстрактный класс суперкласса, так и суперкласс в подкласс.
Ниже приведен код, который я использую в качестве примера для
from abc import ABC, abstractmethod
class foo(ABC):
def __init__(self):
pass
@abstractmethod
def bar(self):
pass
def item(self):
a = 1
b = 2
c = a b
print(c)
class bar_for_foo_mixin(foo):
def __init__(self):
foo.__init__(self)
def bar(self):
print("This should satisfy the abstract method requirement")
self.item()
fo = foo()
temp = bar_for_foo_mixin(fo)
temp.bar()
Это вызывает исключение с указанием:
Can't instantiate abstract class foo with abstract methods bar
Но если я перейду к подклассу, он будет нормально работать с приведенным ниже кодом.
from abc import ABC, abstractmethod
class foo(ABC):
def __init__(self):
pass
@abstractmethod
def bar(self):
pass
def item(self):
a = 1
b = 2
c = a b
print(c)
class bar_for_foo_mixin(foo):
def __init__(self):
foo.__init__(self)
def bar(self):
print("This should satisfy the abstract method requirement")
self.item()
class myfoo(bar_for_foo_mixin):
def __init__(self):
print("myfoo __init__ called")
self.bar()
self.item()
obj = myfoo()
Не могли бы вы объяснить мне, к чему я клоню.
Комментарии:
1. Проблема заключается в попытке создания экземпляра
foo
напрямую.bar_for_foo_mixin
(на самом деле это не смешивание, это просто подклассfoo
) не принимает никаких аргументов, так зачем, по-вашему, вам это нужноfo
в первую очередь?2.Здесь также нет множественного наследования. Возможно, вы думаете о дизайне, в котором
bar_for_foo_mixin
просто расширяетсяobject
, а затемmyfoo
наследуется от обоихfoo
иbar_for_foo_mixin
.3. @chepner указывает, что целью абстрактного класса ЯВЛЯЕТСЯ НЕ создание экземпляра (например, fo = foo () никогда не следует использовать), абстрактный класс существует только для наследования от subc;ass
4. @chepner, Спасибо за разъяснение. У меня есть еще один вопрос. Есть ли способ получить доступ к переменной метода суперкласса в подклассе? Допустим, у меня есть переменная с именем z в новом методе bar2() в bar_for_foo_mixin(). Могу ли я получить к нему доступ в классе myfoo?
5. Если это локальная переменная, то нет. Если вы хотите обмениваться данными между двумя методами, вам нужно сделать это с помощью атрибутов экземпляра.