Pythonが複数の継承を許可する場合、Pythonの慣用的な継承はどのように見えますか?
Javaのように単一継承の言語では、あるオブジェクトが別のオブジェクトの「is-a」であり、オブジェクト間でコードを共有したい場合(親オブジェクトから子オブジェクトまで)は、継承が使用されます。たとえば、それDog
はAnimal
:
public class Animal {...}
public class Dog extends Animal {...}
しかし、Pythonは多重継承をサポートしているため、他の多くのオブジェクトを組み合わせてオブジェクトを作成できます。以下の例を検討してください。
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
これはPythonでの多重継承の許容できる使用法ですか?継承とは、あるオブジェクトが別のオブジェクトの "is-a"である場合ではなくUser
、UserService
およびで構成されるモデルを作成しますLoggingService
。
データベースまたはネットワーク操作のすべてのロジックUser
は、それらをUserService
オブジェクトに配置し、にログインするためのすべてのロジックを保持することにより、モデルとは別に保つことができますLoggingService
。
このアプローチのいくつかの問題は次のとおりです。
- これは神オブジェクトを作成しますか?以来
User
からの継承、またはで構成され、UserService
そしてLoggingService
それは本当に、単一責任の原則に従っていますか? - parent / next-in-lineオブジェクトのメソッドにアクセスするには(たとえば、
UserService.validate_credentials
を使用する必要がありますsuper
。これにより、このメソッドを処理するオブジェクトを確認することが少し難しくなり、次のように明確ではありません。 、のUserService
ようなものをインスタンス化して行うself.user_service.validate_credentials
上記のコードを実装するためのPython的な方法は何でしょうか?