1

这个问题是关于Python继承的,但用 Django 示例进行了解释,但这应该不会受到伤害。

我有这个 Django 模型,Page还有RichText模型:

class Gallery(Page, RichText):
    def save(self, *args, **kwargs):
        # lot of code to unzip, check and create image instances.
        return "something"

我只对save在另一个类中使用该方法感兴趣。

一个解决方案可能是:

class MyGallery(models.Model):
    def save(self, *args, **kwargs):
        # here goes the code duplicated from Gallery, the same.
        return "something"

我想避免代码重复,而且我对从Pageand继承成员不感兴趣RichText(所以我不想这样做class MyGallery(Gallery):。如果它是合法的,我会写这样的东西:

class MyGallery(models.Model):
    # custom fields specific for MyGallery
    # name = models.CharField(max_length=50)
    # etc

    def save(self, *args, **kwargs):
        return Gallery.save(self, *args, **kwargs)

但它不起作用,因为save()in需要一个, notGallery的实例。GalleryMyGallery

有什么方法可以“分离”该save()方法并按照那里定义的方式Gallery使用它?MyGallery

编辑:

我忘了说这Gallery是给定的,不能改变。

4

2 回答 2

2

您可以访问方法的__func__属性save

class Gallery(object):
    def save(self, *args, **kwargs):
        return self, args, kwargs

class MyGallery(object):
    def save(self, *args, **kwargs):
        return Gallery.save.__func__(self, *args, **kwargs)
    # or 
    # save = Gallery.save.__func__

mg = MyGallery()
print mg.save('arg', kwarg='kwarg')
# (<__main__.MyGallery object at 0x04DAD070>, ('arg',), {'kwarg': 'kwarg'})

但如果可能的话,你最好重构:

class SaveMixin(object):
    def save(self, *args, **kwargs):
        return self, args, kwargs

class Gallery(SaveMixin, object):
    pass

class MyGallery(SaveMixin, object):
    pass

或者

def gallery_save(self, *args, **kwargs):
    return self, args, kwargs

class Gallery(object):
    save = gallery_save

class MyGallery(object):
    save = gallery_save
于 2012-05-26T22:31:51.740 回答
0

我不确定您为什么反对继承,尤其是在方法方面。我经常创建一个MixIn由我的所有 Django 继承的类,models.Model它包含用于 URL 创建、转储等的各种有用方法。我确实使这些方法具有防御性,因为它们hasattr()用来确保它们适用于特定的课程,但这样做可以节省大量时间。

于 2012-05-26T23:15:47.400 回答