Python 如何为从sqlalchemy声明性基扩展而来的类定义元类

Python 如何为从sqlalchemy声明性基扩展而来的类定义元类,python,dynamic,attributes,sqlalchemy,metaclass,Python,Dynamic,Attributes,Sqlalchemy,Metaclass,我使用:Python 2.6和sqlalchemy 0.6.1 这就是我想做的: from sqlalchemy.types import ( Integer, String, Boolean ) from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class SampleMeta(type): def __new__(cls, name, base

我使用:Python 2.6和sqlalchemy 0.6.1

这就是我想做的:

from sqlalchemy.types import (
    Integer,
    String,
    Boolean
)
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class SampleMeta(type):
    def __new__(cls, name, bases, attrs):
        attrs.update({   'id': Column('Id', Integer, primary_key=True),
                    'name': Column('Name', String),
                    'description': Column('Description', String),
                    'is_active': Column('IsActive', Boolean)
                })
        return super(SampleMeta, cls).__new__(cls, name, bases, attrs)

class Sample(Base):
    __tablename__ = 'Sample'
    __table_args__ = {'useexisting': True}
    __metaclass__ = SampleMeta

    def __init__(self, id, name, description, is_active):
        self.id = id
        self.name = name
        self.description = description
        self.is_active = is_active

    def __repr__(self):
        return "<(%d, '%s', '%s', %r)>" % (self.id, self.name, self.description, self.isactive)
现在,如果我使用

class Sample(object)
而不是

class Sample(Base)
它工作得非常好

我需要动态更新类的属性。因此,我将使用动态属性和列名。我需要上面的代码才能到达那里


请帮助

要使用元类,在这种情况下,元类必须派生自声明词
DeclaredMeta
。但是这个用例不需要元类。使用:

从sqlalchemy.types导入(
整数,
一串
布尔值
)
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy导入列
Base=声明性_Base()
类SampleMixin(对象):
id=列(“id”,整数,主键=真)
名称=列(“名称”,字符串)
描述=列(“描述”,字符串)
is_active=列(“IsActive”,布尔值)
类样本(SampleMixin,基):
__tablename_uu='Sample'
__表_args_uu={'useexisting':True}
定义初始化(自我、id、名称、描述,处于活动状态):
self.id=id
self.name=名称
self.description=描述
self.is_active=处于活动状态
定义报告(自我):
返回“%”(self.id,self.name,
self.description,self.isactive)
从sqlalchemy导入选择
打印选择([Sample.id,Sample.name])

如果zzzeek提出多重继承无法解决您的问题,请尝试从DeclarativeMeta继承元类:

来自sqlalchemy.ext.declarative导入declarative_base,DeclarativeMeta
Base=声明性_Base()
类SampleMeta(DeclarativeMeta):
#...
类别样本(基本):
__元类\样本元
#...
class Sample(Base)
from sqlalchemy.types import (
    Integer,
    String,
    Boolean
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column

Base = declarative_base()

class SampleMixin(object):
    id = Column("Id", Integer, primary_key=True)
    name = Column("Name", String)
    description = Column("Description", String)
    is_active = Column("IsActive", Boolean)

class Sample(SampleMixin, Base):
    __tablename__ = 'Sample'
    __table_args__ = {'useexisting': True}

    def __init__(self, id, name, description, is_active):
        self.id = id
        self.name = name
        self.description = description
        self.is_active = is_active

    def __repr__(self):
        return "<(%d, '%s', '%s', %r)>" % (self.id, self.name,
                                self.description, self.isactive)

from sqlalchemy import select
print select([Sample.id, Sample.name])