Wie sieht die idiomatische Vererbung in Python aus, da Python eine Mehrfachvererbung zulässt?
In Sprachen mit einfacher Vererbung wie Java wird die Vererbung verwendet, wenn Sie sagen können, dass ein Objekt ein anderes Objekt "ist" und Sie Code zwischen den Objekten teilen möchten (vom übergeordneten Objekt zum untergeordneten Objekt). Zum Beispiel könnte man sagen, dass dies Dog
ein Animal
:
public class Animal {...}
public class Dog extends Animal {...}
Da Python jedoch die Mehrfachvererbung unterstützt, können wir ein Objekt erstellen, indem wir viele andere Objekte zusammensetzen. Betrachten Sie das folgende Beispiel:
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
Ist dies eine akzeptable oder gute Verwendung der Mehrfachvererbung in Python? Anstatt zu sagen, dass Vererbung ist, wenn ein Objekt ein anderes Objekt "ist", erstellen wir ein User
Modell, das aus UserService
und besteht LoggingService
.
Die gesamte Logik für Datenbank- oder Netzwerkoperationen kann vom User
Modell getrennt gehalten werden, indem sie in das UserService
Objekt eingefügt werden, und die gesamte Logik für die Anmeldung im wird beibehalten LoggingService
.
Ich sehe einige Probleme mit diesem Ansatz:
- Erschafft dies ein Gottobjekt? Da
User
erbt von oder besteht ausUserService
undLoggingService
folgt es wirklich dem Prinzip der Einzelverantwortung? - Um auf Methoden für ein übergeordnetes / next-in-line-Objekt zugreifen zu können (z. B. müssen
UserService.validate_credentials
wir verwendensuper
. Dies macht es etwas schwieriger zu erkennen, welches Objekt mit dieser Methode umgehen wird, und ist nicht so klar wie beispielsweise , instanziierenUserService
und so etwas tunself.user_service.validate_credentials
Was wäre der pythonische Weg, um den obigen Code zu implementieren?