Как наследовать как абстрактный класс, так и суперкласс в подкласс

#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. Если это локальная переменная, то нет. Если вы хотите обмениваться данными между двумя методами, вам нужно сделать это с помощью атрибутов экземпляра.