我有一些有趣的设计问题
我有一些抽象类,我们把它命名为ServiceClass
假设我有两个子类,分别命名为CoolServiceClass
和AmazingServiceClass
,它们都继承自ServiceClass
class ServiceClass(ABC):
@abstractmethod
def do_something(self):
pass
class CoolServiceClass(ServiceClass):
def do_something(self):
return 'Cool!'
def do_nothing(self):
return 'Nothing!'
class AmazingServiceClass(ServiceClass):
def do_something(self):
return 'Amazing!'
def just_do_it(self):
return 'Nope'
我想写客户机代码,但我不希望它耦合到客户机代码中的一个子类。我不希望客户机代码能够使用任何方法just_do_it
或do_nothing
,因此我能够轻松地在它们的实现之间进行替换。我知道python是duck类型的语言,但我仍然想知道处理这种情况的正确方法是什么
我想到的一个解决方案是使用某种代理类,它看起来像这样:
class ProxyServiceClass(ServiceClass):
def __init__(self, service_class):
self.service_class = service_class
def do_something(self):
return self.service_class.do_something()
然后客户端代码将如下所示:
service_class1 = ProxyServiceClass(CoolServiceClass())
service_class2 = ProxyServiceClass(AmazingServiceClass())
现在,如果我尝试使用任何方法just_do_it
或do_nothing
,我将得到一个异常
我对这个解决方案有点怀疑,因为我还没有看到类似的解决方案,我很乐意听取您的意见
谢谢
如果
do_nothing
是一个私有方法(即不能从类外部访问它),请将其重命名为__do_nothing
(Why are Python's 'private' methods not actually private?)如果您希望它能够被一些外部用户访问,而不是其他用户访问,那么除了您描述的包装器之外,我看不到其他解决方案
相关问题 更多 >
编程相关推荐