python中的抽象方法和mixin

2024-10-03 09:09:56 发布

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

我想提交一个我经常在python代码中看到的代码模式,在这里工作,我对它不满意,我想要一个更好的解决方案。在

以下是我们今天的情况:

class AbstractClass(object):
    ....
    def method1(self,...)
       raise NotImplementedError
    ...

class FirstImplementationMixin(object)
    def method1(self,....) 
       ...

class SecondImplementationMixin(object)
    def method1(self...)
       ....

class InstanciatedClass1(FirstImplementationMixin, AbstractClass)
    ....

class InstanciatedClass2(SecondImplementationMixin, AbstractClass)
    ....

你明白窍门了吗?我得把混音放在列表的第一位 我不喜欢这个解决方案。如果我们在第二个位置加上它,解释器将使用抽象类方法1所以提出例外。在

在这种简单的情况下,用中间类替换mixin是可能的,但是在已经有基类的复杂继承的情况下,解决方案可能并不明显。在

对你来说最好的设计模式是什么?在


Tags: 代码selfobjectdef模式情况解决方案class
1条回答
网友
1楼 · 发布于 2024-10-03 09:09:56

好吧,正如我在评论中提到的,这就是Python的工作方式,我不认为改变它是个好主意。在

尽管如此,metaclasses去救他!
您可以创建自己的元类,并根据需要使其复杂化。在这里我将向您展示一个非常基本的例子。在

def mixed(name, bases, dct):
    return type(name, bases[1:] + (bases[0],), dct)

它只是将第一个基类移到最后,所以现在您将实际的基类放在第一位,然后是所有的mixin。这意味着您只能使用一个基类。您可以通过某种约定来解除这个限制,例如,您将首先列出基类,然后None,然后mixin;您的元类将查找这个{}并相应地重新排列元组。在

^{pr2}$
>>> Test.__mro__
                 >
(<class '__main__.Test'>,
 <class __main__.MixinA at 0x6f8850db48>,
 <class __main__.MixinB at 0x6f8850dae0>,
 <class '__main__.Base'>,
 <type 'object'>)

当然,您不会每次都指定__metaclass__,因为用于选择元类的规则。您可能会在模块级别或mixin中设置__metaclass__。这是你的选择,任何更适合你的代码结构。在

相关问题 更多 >