Dado que o Python permite herança múltipla, como é a herança idiomática no Python?
Em linguagens com herança única, como Java, a herança seria usada quando se poderia dizer que um objeto "é-a" de outro objeto e você deseja compartilhar código entre os objetos (do objeto pai ao objeto filho). Por exemplo, você poderia dizer que Dog
é um Animal
:
public class Animal {...}
public class Dog extends Animal {...}
Porém, como o Python suporta herança múltipla, podemos criar um objeto compondo muitos outros objetos juntos. Considere o exemplo abaixo:
class UserService(object):
def validate_credentials(self, username, password):
# validate the user credentials are correct
pass
class LoggingService(object):
def log_error(self, error):
# log an error
pass
class User(UserService, LoggingService):
def __init__(self, username, password):
self.username = username
self.password = password
def authenticate(self):
if not super().validate_credentials(self.username, self.password):
super().log_error('Invalid credentials supplied')
return False
return True
Esse é um uso aceitável ou bom de herança múltipla em Python? Em vez de dizer que herança é quando um objeto "é-a" de outro objeto, criamos um User
modelo composto por UserService
e LoggingService
.
Toda a lógica para operações de banco de dados ou rede pode ser mantida separada do User
modelo, colocando-as no UserService
objeto e mantendo toda a lógica para efetuar login no LoggingService
.
Vejo alguns problemas com essa abordagem:
- Isso cria um objeto de Deus? Uma vez que
User
herda, ou é composta por,UserService
eLoggingService
está realmente seguindo o princípio da responsabilidade única? - Para acessar métodos em um objeto pai / próxima linha (por exemplo,
UserService.validate_credentials
temos que usarsuper
. Isso torna um pouco mais difícil ver qual objeto vai lidar com esse método e não é tão claro quanto, por exemplo, , instanciandoUserService
e fazendo algo comoself.user_service.validate_credentials
Qual seria a maneira Pythonic de implementar o código acima?