Класс Python, который наследует от себя? Как это работает? - PullRequest
5 голосов
/ 16 января 2010

Относительно новичок в Python, и я увидел следующую конструкцию в библиотеке PyFacebook (источник здесь: http://github.com/sciyoshi/pyfacebook/blob/master/facebook/init.py#L660). Мне интересно, что это делает, потому что он, похоже, является классом, который наследуется от самого себя.

class AuthProxy(AuthProxy):
    """Special proxy for facebook.auth."""

    def getSession(self):
        """Facebook API call. See http://developers.facebook.com/documentation.php?v=1.0&method=auth.getSession"""
        ...
        return result

    def createToken(self):
        """Facebook API call. See http://developers.facebook.com/documentation.php?v=1.0&method=auth.createToken"""
        ...
        return token

что это делает?

Тангенциально связано, я использую PyDev в Eclipse, и это помечается как ошибка. Я предполагаю, что это не так. В любом случае, чтобы Eclipse знал, что это хорошо?

Ответы [ 4 ]

14 голосов
/ 16 января 2010

Оператор класса там не делает класс наследуемым от самого себя, он создает объект класса с текущим значением AuthProxy в качестве суперкласса, а затем назначает объект класса переменной 'AuthProxy', предположительно перезаписывая ранее назначенный класс AuthProxy, от которого он унаследовал.

По сути, это примерно то же самое, что и x = f(x): x не является значением f для себя, нет круговой зависимости - есть только старый x и новый x. Старый AuthProxy и новый AuthProxy.

3 голосов
/ 16 января 2010

«Бывший» AuthProxy создается __generate_proxies (это не очень хороший код, в нем даже есть exec и eval :)), но автор хотел также определить некоторые методы поверх него .

3 голосов
/ 16 января 2010

Он использует AuthProxy, импортированный из другого модуля (проверьте импорт) и производный от него.

1 голос
/ 04 января 2011

Чтобы Eclipse прекратил ныть по этому поводу, сделайте следующее:

класс AuthProxy (AuthProxy): # @ UndefinedVariable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...