Vì vậy, tôi có một loạt các bảng sử dụng SQLAlchemy được mô hình hóa như các đối tượng kế thừa từ kết quả đến một cuộc gọi đến declarative_base()
. Ví dụ:Sqlalchemy: tránh nhiều thừa kế và có lớp cơ sở trừu tượng
Base = declarative_base()
class Table1(Base):
# __tablename__ & such here
class Table2(Base):
# __tablename__ & such here
vv sau đó tôi muốn có một số chức năng thông thường có sẵn cho mỗi lớp học bảng DB của tôi, the easiest way to do this according to the docs là chỉ cần làm đa kế thừa:
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
Điều tôi không thích về điều này là A) nhiều thừa kế nói chung là một chút icky (được giải quyết khó khăn những thứ như super()
cuộc gọi, vv), B) nếu tôi thêm một bảng mới tôi phải nhớ kế thừa từ cả hai Base
và CommonRoutines
, và C) thực sự rằng "CommonRoutines" class "is-a" loại bảng theo nghĩa nào đó. Thực sự những gì CommonBase
là một lớp cơ sở trừu tượng định nghĩa một tập hợp các trường & các thường trình chung cho tất cả các bảng. Đặt một cách khác: "nó-a" bảng trừu tượng.
Vì vậy, những gì tôi muốn là thế này:
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
Nhưng điều này tất nhiên không hoạt động, như tôi thì có đến A) định nghĩa một __tablename__
cho AbstractTable
, B) các khía cạnh ABC thứ gây ra tất cả các loại đau đầu, và C) phải chỉ ra một số loại mối quan hệ DB giữa AbstractTable
và mỗi bảng riêng lẻ.
Câu hỏi của tôi: có thể đạt được điều này một cách hợp lý không? Lý tưởng nhất là tôi muốn thực thi:
- Không thừa kế nhiều
CommonBase
/AbstractTable
được trừu tượng (tức là không thể được khởi tạo)
Đúng tôi nếu tôi là sai, nhưng những người thừa kế "AbstractTable" nên đọc "cơ sở", có đúng không? (tức là 'lớp Table1 (Cơ sở):') –
@AdamParkin: tất nhiên. sửa chữa. – van
Yup, đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn! Hạn chế duy nhất của phương thức này là bây giờ '__init__' của lớp' CommonBase' không được gọi ('declarative_base' tạo ra một lớp không gọi' super' trong '__init__' của nó nên các cơ chế thừa kế hợp tác của Python không công việc). Hmm .... –