Переопределение метода класса и доступ к его переменным

Я пытаюсь переопределить метод GetFollowerID этого класса: https://github.com/bear/python-twitter/blob/master/twitter.py

Чего я хочу добиться, так это нормально выполнить функцию и получить next_cursor не просто result,

Я попробовал следующее:

class MyApi(twitter.Api):
    def GetFollowerIDs(self, *args, **kwargs):
        super(MyApi, self).GetFollowerIDs(*args, **kwargs)

        print result
        print next_cursor

Я получил эту ошибку:

TypeError: unbound method GetFollowerIDs() must be called with MyApi instance as first argument (got nothing instead)

При вызове это так:

ids = MyApi.GetFollowerIDs(
                    screen_name=options['username'],
                    cursor=cursor,
                    count=options['batch-size'],
                    total_count=options['total'],
                )

Более того, result а также next_cursor уже отображаются как не определены в моей IDE.

2 ответа

Решение

TypeError не имеет ничего общего с вашим определением, но с вашим вызовом:

ids = MyApi.GetFollowerIDs(
                    screen_name=options['username'],
                    cursor=cursor,
                    count=options['batch-size'],
                    total_count=options['total'],
                )

GetFollowerIDs это метод экземпляра, поэтому он требует self параметр. Таким образом, вы должны вызывать его для экземпляра класса, а не для самого класса.

Примеры документации API показывают, как правильно создать и использовать экземпляр twitter.API; вы будете делать то же самое, кроме как для создания и использования экземпляра MyApi вместо.

Вы также можете прочитать учебник по классам или какой-нибудь сторонний учебник, если это не очевидно, как только указывалось ранее.


Между тем, внутри метода вы правильно вызываете базовый класс через super… Но это не позволит вам получить доступ к локальным переменным из метода базового класса. Локальные переменные являются локальными; они живут только во время работы метода. Итак, после возврата метода базового класса они даже больше не существуют.

Причина, по которой ваша IDE говорит, что они не определены, заключается в том, что они на самом деле не определены, кроме как в рамках реализации этого метода.

Если вам действительно необходим доступ к внутреннему состоянию реализации метода, единственным разумным обходным решением будет копирование реализации этого метода в ваш код вместо вызова метода.

Проблема в том, что вы забыли аргумент self в строке 3 при звонке GetFollowerIDs:

class MyApi(twitter.Api):
    def GetFollowerIDs(self, *args, **kwargs):
        super(MyApi, self).GetFollowerIDs(self,*args, **kwargs)

        print result
        print next_cursor
Другие вопросы по тегам