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

时间:2016-09-17 06:08:34

标签: python sqlalchemy mixins

通常情况下,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

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

SQLAlchemy可以实现吗?或者一般来说,在Python中甚至可以使用Mixin?感谢。

1 个答案:

答案 0 :(得分:1)

我建议使用python decorator

以下是如何使用plan python类获取此代码的示例:

c:\git\yoursite> git push https://yourlogin@yoursite.scm.azurewebsites.net:443/yoursite.git

输出:

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)

您必须根据sqlalchemy进行调整,例如将>>> String here, can be SQLAlchemy column object setattr相关联。