[英]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.