'通用视图课程'在Django非常困惑我。 例如:
class ProfileDetailView(DetailView):
def get_object(self):
username = self.kwargs.get('username')
if username is None:
raise Http404
return get_object_or_404(User, username__iexact=username, is_active=True)
如果没有实例化的过程,它也可以。
我能理解的是:
class ProfileDetailView(DetailView):
def __init__(self, *args, **kwargs)
super().__init__(*args, **kwargs)
def get_object(self):
username = self.kwargs.get('username')
if username is None:
raise Http404
return get_object_or_404(User, username__iexact=username, is_active=True)
背后的机制是什么?
答案 0 :(得分:2)
这是继承的基本原则:
供您参考:
9. Classes — Python 3.6.3 documentation
class Mapping:
def __init__(self, iterable):
self.items_list = []
self.__update(iterable)
def update(self, iterable):
for item in iterable:
self.items_list.append(item)
__update = update # private copy of original update() method
class MappingSubclass(Mapping):
def update(self, keys, values):
# provides new signature for update()
# but does not break __init__()
for item in zip(keys, values):
self.items_list.append(item)
答案 1 :(得分:0)
在Python3
super
方法中,表现得更神奇。它会自动计算出类的父级,并隐式传递self
。它与Django本身没有任何关系。这样做是为了减少代码冗余。在更改班级名称时被迫更改所有super
来电非常恼火。
# Python2
class B(A):
def __init__(self, *args, **kwargs):
super(A, self).__init__(*args, **kwargs)
# Python 3
class B(A):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
现在就Django通用视图而言,有一个as_view
类方法可以创建View的可调用实例,该实例将调用委托给dispatch
方法。
答案 2 :(得分:0)
实例化Class时,名为__init__
的{{1}}方法会自动调用。这里继承constructor
时,super()调用将从DetailView中获取所有DetailView
功能。
__init__
且不是class ProfileDetailView(DetailView): # here DetailView is inherited
def __init__(self, *args, **kwargs) # Own class(ProfileDetailView)'s __init__
super().__init__(*args, **kwargs) # it takes DetailView's __init__ behabiour
拥有,因此第二次ProfileDetailView
避免__init__
。