拿“自我”没有' def __init __' Django中的一个实例

时间:2017-11-02 14:09:09

标签: django

'通用视图课程'在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)

背后的机制是什么?

3 个答案:

答案 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__