有没有办法在 Python 的子类中多次包含同一个 Mixin?

Is there a way to include the same Mixin more than once in a subclass in Python?

通常 Python mixin 只会包含一次,例如:

class MyMixin:
    pass
class Child(Base, MyMixin):
    pass

然而,在某些情况下,如果我们可以两次使用同一个 Mixin 会很方便。 例如,我在 SQLAlchemy 中有一个 Mixin 定义了一些列如下:

class MyNoteMixin:
    note = Column(String)
    by_who = Column(String)

现在我有一个继承自上述Mixin的子类,但是需要两个不同的列,都是注释性质的。我可以做类似的事情吗:

class Child(Base, MyNoteMixin as "Description", MyNoteMixin as "Quote"):
        pass

因此,已解析的 table 将包含一个名为 Description 的列,除了名称外,它完全是 MyNoteMixin 的副本,并且还有另一个具有相同性质的名为 Quote 的列。

SQLAlchemy 可以吗?或者一般来说,在 Python 中甚至可以这样使用 Mixin 吗?谢谢

我建议使用 python decorator

这是一个如何使用计划 python class:

获取此信息的示例
def custom_fields(**kwargs):
    def wrap(original_class):
        """
        Apply here your logic, could be anything!
        """
        for key, val in kwargs.items():
            setattr(original_class, key, val)
        return original_class
    return wrap


@custom_fields(quote='String here, can be SQLAlchemy column object')
class Child:
    pass


print(Child.quote)

输出:

>>> String here, can be SQLAlchemy column object

您必须针对 sqlalchemy 对其进行调整,例如将 setattr 连接到您的 MyNoteMixin