参见Raymond Hettinger-超级超级!-PyCon 2015,有关如何使用超级继承和多重继承而不是DI的争论。如果您没有时间观看整个视频,请跳至第15分钟(但我建议您观看所有视频)。
class TokenInterface():
def getUserFromToken(self, token):
raise NotImplementedError
class FrameworkClass(TokenInterface):
def do_the_job(self, ...):
# some stuff
self.user = super().getUserFromToken(...)
class sqlUserFromToken(TokenInterface):
def getUserFromToken(self, token):
# load the user from the database
return user
class ClientFrameworkClass(FrameworkClass, sqlUserFromToken):
pass
framework_instance = ClientFrameworkClass()
framework_instance.do_the_job(...)
这将起作用,因为Python MRO将保证调用getUserFromToken客户端方法(如果使用了super())。如果您使用的是Python2.x,则必须更改代码。
此处的另一个好处是,如果客户端不提供实现,则会引发异常。