2015-01-05 7 views
0

У меня есть родительский класс BaseResource, в котором я определяю поведение, которое должно быть общим для всех дочерних. Я переписываю ModelResource.update_in_place, который определен в некоторой модели django-tastypie.Как получить тип класса от родителя

class BaseResource(ModelResource): 

    def update_in_place(self, ...): 
     ... 
     return super(ChildResource, self).update_in_place(...) 

Теперь у меня есть Child1Resource, Child2Resource которые оба унаследовать от BaseResource. Как я могу получить тип дочернего ресурса внутри родителя?

Я пробовал self.__class__(), но получаю must be type, not Child1Resource.

ответ

3

Вы должны self.__class__, не self.__class__() (в круглых скобках являются оператором вызова, поэтому позже возвращает self.__class__ экземпляра, а не сам класс

Но в любом случае:. Это не как использовать super(), вы на самом деле хочу передать BaseResource в качестве первого аргумента здесь - все дело в том, чтобы передать класс, в котором этот метод определен, а не класс, на котором вызывается метод (что было бы бессмысленным, поскольку он может быть проверен с использованием self.__class__).

+0

Но почему это не по умолчанию? Поскольку первый параметр должен * a lways * имя 'self', почему мы должны его указывать? –

+0

@MathieuMarques: [Это в Python 3] (https://www.python.org/dev/peps/pep-3135/). Еще одна причина для обновления. – Kevin

+0

@MathieuMarques: первым параметром всегда должен быть класс, в котором 'super()' вызывается_, но я предполагаю, что вы имеете в виду второй параметр? Если да, прочитайте документ для 'super()': это может быть «Нет», экземпляр или класс (для классов). Чтобы правильно работать (т. Е. Обеспечить вызовы всех «супер» методов в правильном порядке), 'super' должен знать как класс, так и экземпляр, на который был вызван метод, и класс, в котором вызывается' super'. Реализация Python2 решила его простейшим, явным, но не сухим способом, Python3 улучшил его, чтобы сделать его DRYer. –