Python 如何使每个子类的一个类方法不同(并从基类调用它)

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):

对于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 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
是一个属性,因此可以将其视为检索成员变量。查看我的编辑,查看您可能从视图调用的代码。