【发布时间】:2018-08-29 01:56:39
【问题描述】:
我正在 PyQt 中设计一个使用特定网站帐户的应用程序。所以我有一个名为 Account 的基类,以及从 Account 派生的网站特定帐户类,例如:GoogleAccount、YouTubeAccount 等。
这些派生帐户类中的每一个都需要描述它是否具有下载、上传或两者兼而有之的能力。基本上是否为特定网站实现了下载或上传接口方法。因此,特定网站的每个帐户实例都具有相同的下载/上传功能。
我试图弄清楚如何构建这些帐户类,这些类可以具有特定的可下载/可上传功能组合。我想出的一种解决方案是使用接口隔离原则中的多重继承类型模式:
class Downloadable(metaclass=ABCMeta):
@abstractmethod
def doDownload(): raise NotImplementedError("Reimplement me")
class Uploadable(metaclass=ABCMeta):
@abstractmethod
def doUpload(): raise NotImplementedError("Reimplement me")
class YoutubeAccount(Account, Downloadable):
""" All accounts from this website implement download capability """
def doDownload(): # dostuff
def otherMethods(): pass
class GoogleAccount(Account, Downloadable, Uploadable):
""" All accounts on this website implement both download and upload capability """
def doDownload(): # doStuff
def doUpload(): # doStuff
def otherMethods(): pass
另一个超级简单的解决方案是添加两个布尔类属性
class YoutubeAccount(Account):
DOWNLOADABLE = True
UPLOADABLE = False
def doDownload(): # doStuff
class GoogleAccount(Account):
DOWNLOADABLE = True
UPLOADABLE = True
def doDownload(): # doStuff
def doUpload(): # doStuff
要检查下载/上传功能(例如,显示所有可以下载的帐户),您可以使用 isinstance(account, Downloadable) 来表示第一个多重继承解决方案,使用 account.DOWNLOADABLE 表示第二个布尔解决方案。
我倾向于使用多重继承的第一个解决方案。还有其他人对如何构造这样的类有任何其他建议吗?
【问题讨论】:
标签: python oop design-patterns decorator