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"

コードの重複を避けたいのですが、Pageとからメンバーを継承することに興味が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)

ただし、inは。ではなくのインスタンスを予期しているため、機能save()GalleryませGalleryMyGallery

メソッドを「切り離して」、そこで定義されているとおりに使用するsave()方法はありますか?GalleryMyGallery

編集:

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 に答える