有没有办法在 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
。
通常 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
。