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 Dogein 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 UserModell, das aus UserServiceund besteht LoggingService.
Die gesamte Logik für Datenbank- oder Netzwerkoperationen kann vom UserModell getrennt gehalten werden, indem sie in das UserServiceObjekt 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
Usererbt von oder besteht ausUserServiceundLoggingServicefolgt 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_credentialswir verwendensuper. Dies macht es etwas schwieriger zu erkennen, welches Objekt mit dieser Methode umgehen wird, und ist nicht so klar wie beispielsweise , instanziierenUserServiceund so etwas tunself.user_service.validate_credentials
Was wäre der pythonische Weg, um den obigen Code zu implementieren?