Python 如何使每个子类的一个类方法不同(并从基类调用它)
对于Concert实例,我得到:unbound方法do_stuff()必须以Concert实例作为第一个参数调用(取而代之的是getmodelbase实例) models.py:Python 如何使每个子类的一个类方法不同(并从基类调用它),python,django,Python,Django,对于Concert实例,我得到:unbound方法do_stuff()必须以Concert实例作为第一个参数调用(取而代之的是getmodelbase实例) models.py: class Event(models.Model): def do_stuff(self): response self.do_specific_stuff(self) class Concert(Event): def do_specific_stuff(self):
class Event(models.Model):
def do_stuff(self):
response self.do_specific_stuff(self)
class Concert(Event):
def do_specific_stuff(self):
...
class Party(Event):
def do_specific_stuff(self):
...
观点:
def index(request):
x = Concert.objects.get(name='Jack White @ Oakland')
output = x.do_stuff()
return HttpResponse(output)
我的目标是循环所有事件,并根据事件的类型执行特定于do_的子类方法。在Django中,继承触发多表继承,但在Python中没有多态性。它只是ORM的一个实例,没有在数据模式和对象模型之间提供完美的对应关系 换句话说,当您查询Event时,您会返回一大堆Event对象,而不管其中的一些对象实际上是Concert还是Party对象。你必须手动向下转换。如果事件是一个Concert,它将具有一个名为
Concert
的属性,该属性指向相应的Concert子类。党也是如此。如果它只是一个普通事件,那么它将没有任何属性
您可以在事件上使用以下属性自动向下投射对象:
@property
def as_child_class(self):
"""Casts this object to its subclass, if possible"""
if hasattr(self, 'concert'):
return self.concert
elif hasattr(self, 'party'):
return self.party
else:
return self
然后你可以做一些类似的事情:
for event in Event.objects.all()
event.as_child_class.do_specific_stuff()
类似的问题以前也曾出现过:
事件
模型仅用于继承,因此您应该对其进行抽象:
class Event(models.Model):
class Meta:
absract = True
def do_stuff(self):
response self.do_specific_stuff()
def do_specific_stuff(self):
raise NotImplemented
class Concert(Event):
def do_specific_stuff(self):
...
class Party(Event):
def do_specific_stuff(self):
...
我可能错误地使用了事件
,但如果是这样,将事件
模型抽象为一个普通类,我的意思是不会对此类模型执行任何数据库操作
希望这有帮助!:) 首先,请参见
其次,事件类应该是抽象的
class Event:
def __init__:
raise NotImplemented('This class is abstract')
第三,请参阅和模式。
以及模式的django ORM实现
Good luck=)您的类事件没有方法do_specific_stuff(),如果有,您不需要将self传递给它。哪个类会
Event.objects.get(name='Jack White@Oakland')
返回的实例?我知道,但我的问题是我可以调用子类方法do_specific_stuff(本例中的concert)吗通过views.py?@Vaughn中的基类创建事件的实例class@Dieter:事件类没有特定于do\u的内容。你需要得到一个音乐会或派对的实例。这是有道理的!我怎么用这个?让我试试!只有在事件对象上调用它时,才会希望执行self.as\u child\u class.do\u specific\u stuff()
。您不需要手动将self传递给任何函数,而且由于as\u child\u class
是一个属性,因此可以将其视为检索成员变量。查看我的编辑,查看您可能从视图调用的代码。