1

Django プロジェクト用のカスタム クラス ベースのビューを作成していますが、属性に関する設計上の決定に直面しました。

ゲッター関数

Django のジェネリック ビューを調べたところ、クラス変数とカスタム ゲッター関数の両方を提供するクラスが非常に多くあることがわかりました。例えば

class FormMixin(object):
    initial = {}
    def get_initial(self):
        return self.initial

この設計上の決定は理にかなっています。そのようにするsuper()と、拡張クラスのオーバーライド メソッドを呼び出すことができるからです。

プロパティ

私のプロジェクトでは、単純な値を使用してオーバーライドできる特定の値がありますが、動的に生成する必要がある場合があります。最初は上記と同様のメソッドを作成しましたが、これを行うにはプロパティの方が適しているのではないかと考えました。

class MyBaseView(OtherView):
    counter = None

class MyExtendingView(MyBaseView):
    counter = 5

class MyOtherExtendingView(MyBaseView):
    @property
    def counter(self):
        return self.other_function()

インスタンス.__dict__

これらの値をテンプレート内で使用する予定です。拡張ビューのインスタンスをテンプレートに渡し、次の方法で属性を表示します。

context['class_instances'] = [MyExtendingView(), MyOtherExtendingView()]

{% for instance in class_instances %}
    {{ instance.counter|default:'' }}
{% endfor %}

これはテンプレートであり、インスタンス属性が値であるか関数であるかは問題ではないため、次のようにクラスを記述することもできます。

class MyExtendingView(MyBaseView):
    counter = 5

class MyOtherExtendingView(MyBaseView):
    def counter(self):
        return self.other_function()

def counterは、 の古い値ベースの属性を置き換えますinstance.__dict__

質問

質問にたどり着くには、リストされているアプローチのどれが最良の選択ですか?

  • super()親のゲッター関数を呼び出すことができるので、ゲッターのアプローチは素晴らしいですが、ほとんどの場合、それはおそらく必要ありません。
  • プロパティ アプローチははるかに単純であり、記述されるコードが少なくなります。super()ただし、親のプロパティ関数を呼び出すことはできません。ほとんどの場合、この動作は必要ありませんが、super()機能が必要な場合があるため、プロパティとカスタム getter 関数を使用してオーバーライドできる単純な属性が混在しています。
  • 最後のアプローチは、プロパティ アプローチよりもさらに少ないコードですが、スタイルが良いとは思えません。
4

1 に答える 1

2

プロパティ アプローチははるかに単純であり、記述されるコードが少なくなります。ただし、親のプロパティ関数を super() で呼び出すことはできません。

実際には、次の方法で親プロパティにアクセスできますsuper()

class A(object):
    @property
    def prop(self):
        return 'A.prop'

class B(A):
    @property
    def prop(self):
        return '%s - %s' % (super(B, self).prop, 'B.prop')

>>> b = B()
>>> b.prop
'A.prop - B.prop'
于 2012-02-29T20:58:04.627 に答える