簡體   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