Переопределение метода класса и доступ к его переменным
Я пытаюсь переопределить метод 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