1

我正在为 Django 项目创建基于自定义类的视图,并面临有关属性的设计决策。

吸气剂函数

我查看了 Django 的通用视图,发现有很多类同时提供类变量和自定义 getter 函数。例如

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__

问题

要回答这个问题,列出的方法中哪一个是最佳选择?

  • getter 方法很好,因为它允许super()调用父级的 getter 函数,但在我的大多数情况下,这可能永远不需要。
  • 属性方法更简单,编写的代码更少。不过,我不能super()调用父母的属性函数。在大多数情况下我不需要这种行为,但在某些情况下我需要super()功能,因此可以使用属性和自定义 getter 函数覆盖的简单属性的组合。
  • 最后一种方法比属性方法的代码更少,但我怀疑它的风格很好。
4

1 回答 1

2

属性方法更简单,编写的代码更少。我不能 super()-call 父母的属性函数。

您实际上可以通过以下方式访问父属性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 回答