考虑到Python允许多重继承,Python中的惯用继承是什么样的?
在具有单一继承的语言(例如Java)中,当您可以说一个对象是另一个对象的“是”并且想要在对象之间共享代码(从父对象到子对象)时,将使用继承。例如,您可以说这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中多重继承的可接受还是良好使用?我们创建一个User
由UserService
和组成的模型,而不是说一个对象是另一个对象的“是” LoggingService
。
User
通过将数据库或网络操作的所有逻辑放在UserService
对象中,并保留用于登录的所有逻辑,可以使其与模型分离LoggingService
。
我看到这种方法的一些问题是:
- 这会创造上帝的对象吗?由于
User
从继承,或由,UserService
和LoggingService
是不是真的以下单一职责原则? - 为了访问父对象/下一个行对象上的方法(例如,
UserService.validate_credentials
我们必须使用super
。)这使得查看哪个对象将处理此方法变得更加困难,而且不清楚,实例化UserService
并执行类似的操作self.user_service.validate_credentials
实现上述代码的Python方式是什么?