1

formsets.py には、次のコード スニペットがあります。

class BaseFormSet(StrAndUnicode):
    """
    A collection of instances of the same Form class.
    """
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
                 initial=None, error_class=ErrorList):
        ...
        self.prefix = prefix or self.get_default_prefix()   # Note the self.get_default_prefix
        ...
    ...
    @classmethod                                            # Note the @classmethod
    def get_default_prefix(cls):
        return 'form'

get_default_prefix がこのように宣言されてから、self で呼び出されるのはなぜですか? そうすることで何か得られるものはありますか? get_default_prefixBaseInlineFormSet (forms/models.py) に別の定義があります。

class BaseInlineFormSet(BaseModelFormSet):
    ...
    @classmethod
    def get_default_prefix(cls):
        from django.db.models.fields.related import RelatedObject
        return RelatedObject(cls.fk.rel.to, cls.model, cls.fk).get_accessor_name().replace('+','')

もう 1 つBaseGenericInlineFormsetは @classmethod を使用しているため、タイプミスではないようです。なぜこのようにして、自分自身で呼び出すのか理解できません。

私が見る唯一の手がかり(私には理解できません)は、管理者がそれを呼び出すように見えることですFormSet.get_default_prefix()

Pythonについて理解していないことがあるかどうか疑問に思っています。

4

1 に答える 1

1

コードでわかるように、インスタンスからクラスメソッドを呼び出すことは完全に合法です。関連するstackoverflowの投稿によると、インスタンスから呼び出すことにはメリットはありません(そしてそれは悪い習慣です)。インスタンスからのみ呼び出す場合、メソッドはおそらく。ではないはずだからclassmethodです。

しかし、あなたはあなた自身の質問に答えると思います。djangoがFormSet.get_default_prefix()どこかから呼び出している場合、おそらくフォームセットオブジェクトをインスタンス化することを望まなかったでしょう。

于 2013-03-13T18:52:00.453 に答える