我正在为 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 函数覆盖的简单属性的组合。 - 最后一种方法比属性方法的代码更少,但我怀疑它的风格很好。