如何构造具有不同功能的类

2024-06-16 14:49:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用PyQt设计一个应用程序,它使用特定网站的帐户。因此,我有一个名为Account的基类,以及从Account派生的特定于网站的Account类,如:GoogleAccount、YouTubeAccount等

这些派生的Account类中的每一个都需要描述它是否具有下载、上载或两者兼有的功能。基本上是否下载或上传接口方法是为特定的网站实现。因此,特定网站的每个帐户实例都具有相同的下载/上载功能。你知道吗

我试图找出如何构造这些帐户类,这些帐户类可以具有特定的可下载/可上传功能组合。我提出的一个解决方案是使用接口分段原则中的多重继承类型模式:

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作为第二个布尔解决方案。你知道吗

我倾向于使用多重继承的第一种解决方案。其他人对如何构建这样的类还有什么建议吗?你知道吗


Tags: 功能true网站def帐户account解决方案class
1条回答
网友
1楼 · 发布于 2024-06-16 14:49:34

如果只有少数类是从Account派生的,我认为python的方法应该是选项2。你知道吗

但是如果它违反了您所关心的DRY原则(因为这些类属性是从相应的方法派生出来的),您可以在Account基类上添加canDownloadcanUpload方法,并让它们分别返回hasattr(self, "doDownload")hasattr(self, "doUpload")。你知道吗

相关问题 更多 >