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

2024-04-25 19:41:56 发布

您现在位置:Python中文网/ 问答频道 /正文

对于Concert的实例,必须使用Concert实例作为第一个参数调用unbound方法do\u stuff()(改为使用ModelBase实例)

你知道吗型号.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\u的\u stuff子类方法。


Tags: 实例方法selfeventoutput参数def事件
3条回答

首先,请参见Template method

其次,事件类应该是抽象的。你知道吗

class Event:
   def __init__:
       raise NotImplemented('This class is abstract')

第三,参见Single Table InheritanceClass Table Inheritance模式。 以及模式的django-ORM实现there 好运=)

在我看来,您的Event模型仅用于继承,因此您应该抽象它:

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

关于Event的用法,我可能是错的,但是如果是,抽象Event模型将使它像一个普通类一样,我的意思是不会对这样的模型采取任何数据库操作。你知道吗

希望这有帮助!:)

在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()

类似的问题以前也出现过:

这个链接还有其他一些想法:

相关问题 更多 >

    热门问题