Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Acessando as classes de herança multipla

Bird é Filha de Vertebrate, mas tem 2 mixins, Beak e Oviparous.

1) Está correto essa maneira de definir o contrutor de Bird e de chamar os dunder dos mixins?

2) Os mixins estão herdando de ABC. Isso significa que será uma classe abstrata, ou seja, não pode ser instanciada. A dúvida é : metaclass=ABCMeta é usada para criar interfaces?

class Bird(Vertebrate, Beak, Oviparous):
    def __init__(self, name):
        Vertebrate.__init__(self, name)

    def __str__(self):
        return f'{Vertebrate.__str__(self)}\n' \
               f'{self.name} is a Bird.\n' \
               f'{Oviparous.__str__(self)}\n'\
               f'{Beak.__str__(self)}'



class Beak (ABC):
    @property
    def has_beak(self):
        return True

    def __str__(self):
        return f'It has a beak.'



class Oviparous (ABC):
    @property
    def lay_eggs(self):
        return True

    def __str__(self):
        return f'It can lay eggs.'

1 resposta
solução!

1) Como se trata de herança múltipla, creio que deve-se usar o nome da classe pai ao invés de super() para se referir a qual classe pai se refere. Então creio que seja da forma que vc mencionou. Supondo que a classe Vertebrate esteja definida no módulo. Além disso, é interessante deixar Bird depois de Beak e Oviparous, pois Bird herda delas;

Supondo que foi dado um "from abc import ABC" 2) a classe ABC é abstrata, ou seja, tem 1 ou mais métodos abstratos que devem ser implementados na classe filha. No caso, ela apenas obriga a classe "Bird" a instanciar os métodos abstratos de ABC, e não impede de instanciarmos um objeto Bird.