我正在使用 SQLAlchemy,我的对象模型中的许多类都具有相同的两个属性:id 和(整数和主键)以及名称(字符串)。我试图避免像这样在每个类中声明它们:
class C1(declarative_base()):
id = Column(Integer, primary_key = True)
name = Column(String)
#...
class C2(declarative_base()):
id = Column(Integer, primary_key = True)
name = Column(String)
#...
这样做的好方法是什么?我尝试使用元类,但它还没有用。
最佳答案
您可以将共同属性分解为 mixin class ,并与 declarative_base()
一起乘法继承它:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
class IdNameMixin(object):
id = Column(Integer, primary_key=True)
name = Column(String)
class C1(declarative_base(), IdNameMixin):
__tablename__ = 'C1'
class C2(declarative_base(), IdNameMixin):
__tablename__ = 'C2'
print C1.__dict__['id'] is C2.__dict__['id']
print C1.__dict__['name'] is C2.__dict__['name']
编辑:您可能认为这会导致 C1
和 C2
共享相同的 Column
对象,但是如 SQLAlchemy docs 中所述, Column 对象在源自混合类时被复制。我已经更新了代码示例以演示此行为。
关于python - SQLAlchemy:避免重复声明式类定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3626787/