繁体   English   中英

从超类实例化一个子类

[英]Instantiating a subclass from a superclass

我有以下使用SQLAlchemy在MySQL DB中创建多态结构的python代码。

class Animal(Base):
    key = Column(Integer(), Sequence("My Counter" ,1 ,1), primary_key = True)
    name = Column(String())
    discriminator = Column('type',String())
    __mapper_args__ = {'polymorphic_on':discriminator}

    def __init__(self,key,name):
        self.key = key
        self.name = name

class Cat(Animal):
    __tablename__ = 'cat'
    __mapper_args__ = {'polymorphic_identity':'cat'}
    def walk():
        pass

class Dog(Animal):
    __tablename__ = 'dog'
    __mapper_args__ = {'polymorphic_identity':'dog'}

    def walk():
         pass

我想知道最好的方式是这样加载它:

a = Animal(key=1)
c = a.create()

根据其类型,c现在将是Cat或Dog对象。 动物表具有此信息。

谢谢

这不是使用sqlalchemy查询数据库的方式。 为了获得特定密钥的动物,您需要做的是:

my_key = 1
a = session.query(Animal).get(my_key)
# sqlalchemy will figure out the type automatically and will return object of proper class 
assert type(a) in (Cat, Dog,)

请注意,您提供的模型不完整。 下面的一个应该是一个完整的工作中的一个:

class Animal(Base):
    __tablename__ = 'animal'
    key = Column(Integer(), Sequence("My Counter" ,1 ,1), primary_key = True)
    name = Column(String())
    discriminator = Column('type',String())
    __mapper_args__ = { 'polymorphic_on':discriminator, }

    def __init__(self,key,name):
        self.key = key
        self.name = name

class Cat(Animal):
    __tablename__ = 'cat'
    __mapper_args__ = {'polymorphic_identity':'cat'}
    key = Column(Integer(), ForeignKey('animal.key'), primary_key = True)

    def walk(self):
        print "cat walking"

class Dog(Animal):
    __tablename__ = 'dog'
    __mapper_args__ = {'polymorphic_identity':'dog'}
    key = Column(Integer(), ForeignKey('animal.key'), primary_key = True)

    def walk(self):
        print "dog walking"

我真的不知道该如何将其应用于您编写的内容,但是我做了类似的事情。

您将要创建一个工厂函数; 尽管可能是单独的,但这可能在您的基类中。 无论如何,它都必须是静态函数,因此,如果将其包含在类中,则将其声明为@staticmethod

其次,您可以访问__subclasses__方法,例如BaseClass.__subclasses__()以获得BaseClass的实际子类列表。 在我的情况下,我扫描了子类以查找具有特定类属性的子类,然后将其称为init函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM