2015-05-22 3 views
3

От http://docs.sqlalchemy.org/en/improve_toc/orm/extensions/declarative/mixins.html#augmenting-the-base Я вижу, что вы можете определять методы и атрибуты в базовом классе.Определение абстрактного метода в базовом классе SQLAlchemy

Я хотел бы убедиться, что все дочерние классы реализуют определенный метод. Однако при попытке определить абстрактный метод следующим образом:

import abc 
from sqlalchemy.ext.declarative import declarative_base 

class Base(metaclass=abc.ABCMeta): 
    @abc.abstractmethod 
    def implement_me(self): 
     pass 

Base = declarative_base(cls=Base) 

class Child(Base): 
    __tablename__ = 'child' 

Я получаю ошибку TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

Я пытался найти документацию или примеры, чтобы помочь мне, но подошел короткий.

ответ

4

Похоже, вы можете передать метакласс до declarative_base. По умолчанию метакласса является DeclarativeMeta - Так что, я думаю, что ключ будет создать новый метакласс, который является Mixin из abc.ABCMeta и DeclarativeMeta:

import abc 
from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta 

class DeclarativeABCMeta(DeclarativeMeta, abc.ABCMeta): 
    pass 

class Base(declarative_base(metaclass=DeclarativeABCMeta)): 
    __abstract__ = True 
    @abc.abstractmethod 
    def implement_me(self): 
     """Canhaz override?""" 

* Непроверено

+0

Это, кажется, работает до сих пор с одним незначительным дополнением: мне пришлось установить '__abstract__ = True' в' Base'. Спасибо за вашу помощь! – user1475412