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的な方法は何でしょうか?