gpt4 book ai didi

python - SQLAlchemy:避免多重继承并拥有抽象基类

转载 作者:行者123 更新时间:2023-12-03 14:30:38 35 4
gpt4 key购买 nike

因此,我有一堆使用SQLAlchemy的表,它们被建模为对象,这些对象从结果继承到对declarative_base()的调用。即:

Base = declarative_base()
class Table1(Base):
# __tablename__ & such here

class Table2(Base):
# __tablename__ & such here


然后,我想为我的每个数据库表类提供一些通用功能, the easiest way to do this according to the docs只是做多个继承:

Base = declarative_base()

class CommonRoutines(object):
@classmethod
def somecommonaction(cls):
# body here

class Table1(CommonRoutines, Base):
# __tablename__ & such here

class Table2(CommonRoutines, Base):
# __tablename__ & such here


我不喜欢的是A)多重继承通常有点棘手(很难解决 super()调用等问题,B)如果我添加一个新表,我必须记住要从两者继承 BaseCommonRoutines,以及C)实际上在某种意义上说“ CommonRoutines”类为“ is-a”类型的表。真正的 CommonBase是一个抽象基类,它定义了所有表通用的一组字段和例程。换句话说,“它是一个”抽象表。

所以,我想要的是:

Base = declarative_base()

class AbstractTable(Base):
__metaclass__ = ABCMeta # make into abstract base class

# define common attributes for all tables here, like maybe:
id = Column(Integer, primary_key=True)

@classmethod
def somecommonaction(cls):
# body here

class Table1(AbstractTable):
# __tablename__ & Table1 specific fields here

class Table2(AbstractTable):
# __tablename__ & Table2 specific fields here


但这当然是行不通的,因为我随后不得不A)为 __tablename__定义 AbstractTable,B)事物的ABC方面引起各种麻烦,C)必须指出某种数据库关系在 AbstractTable和每个单独的表之间。

所以我的问题是:是否有可能以合理的方式实现这一目标?理想情况下,我想强制执行:


没有多重继承
CommonBase / AbstractTable是抽象的(即无法实例化)

最佳答案

这很简单,只需使declarative_base()返回使用Base参数从CommonBase继承的cls=类。也显示在Augmenting The Base文档中。然后,您的代码可能类似于以下内容:

class CommonBase(object):
@classmethod
def somecommonaction(cls):
# body here

Base = declarative_base(cls=CommonBase)

class Table1(Base):
# __tablename__ & Table1 specific fields here

class Table2(Base):
# __tablename__ & Table2 specific fields here

关于python - SQLAlchemy:避免多重继承并拥有抽象基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9606551/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com