Python调用含Tweepy的类时出现Unbound Method错误求助
解决Python类方法调用的"unbound method"错误及类初始化问题
嘿,我来帮你搞定这个问题!你遇到的这个错误其实是Python类使用中很常见的新手坑,咱们一步步来解决:
错误原因分析
你看到的 unbound method searchForKeyword() must be called with myfuncs instance as first argument 错误,本质是你直接用类本身调用了实例方法,而没有先创建类的实例对象。Python里的普通方法(没有@classmethod或@staticmethod装饰的)默认第一个参数是self,它指向当前类的实例,所以必须通过实例来调用这类方法,不能直接用类名。
看你的调用代码:
m.searchForKeyword('capitals', 50)
这里的m是你导入的myfuncs类本身,不是类的实例,所以Python找不到self参数,就报错了。
另外,你的myfuncs类的__init__方法也有几个小问题:
- 把
consumer_key、auth、api等作为参数传入,但又直接在方法里硬编码了密钥值,这完全没必要; - 参数里的
access_toekn_secret是拼写错误(应该是access_token_secret); auth和api应该在类内部初始化,而不是从外部传入。
修正后的完整代码
首先是myfuncs类的修正版本
import tweepy from textblob import TextBlob class myfuncs: def __init__(self): # 初始化Twitter API认证信息 self.consumer_key = 'ur7LPai7hD8nYw9CMlQ8exgEO' self.consumer_secret = 'mak7uBwYNucDIhF4lPIfy4JMIEIaVM9Dx0zgEo2LYwru7UDHPi' self.access_token = '816453418235600896-jvDVIfnewq6oJzYIbDFh7vvI9vfMd2I' self.access_token_secret = 'kqJFFHCJMA1mWQmg2XFPvFSnRGasxx4CgxhNVY3vZIweh' # 在类内部完成认证和API实例化 self.auth = tweepy.OAuthHandler(self.consumer_key, self.consumer_secret) self.auth.set_access_token(self.access_token, self.access_token_secret) self.api = tweepy.API(self.auth) def searchForKeyword(self, x, z): sentiment_results = [] public_tweets = self.api.search(x, count=z) # 必须用self.api访问实例属性 for tweet in public_tweets: analysis = TextBlob(tweet.text) sentiment_results.append(analysis.sentiment) print(analysis.sentiment) print("successful") # 修正了拼写错误succesful return sentiment_results # 返回结果列表,方便后续处理
然后是修正后的调用代码
import tweepy from textblob import TextBlob from myfuncs import myfuncs as m # 第一步:先创建类的实例 my_tweet_analyzer = m() # 第二步:通过实例调用方法 my_tweet_analyzer.searchForKeyword('capitals', 50)
关键改动说明
- 实例化类:先创建
my_tweet_analyzer = m(),这样才能通过实例调用方法,Python会自动把实例作为self参数传入; - 访问实例属性:把
api.search()改成self.api.search(),因为api是myfuncs实例的属性,必须通过self来访问; - 优化列表逻辑:原来的
a.append(s)再赋值的写法完全多余,直接把情感分析结果append到列表里就行; - 修正拼写错误:把
succesful改成了正确的successful; - 返回结果:让方法返回情感分析结果列表,方便你后续使用这些数据。
额外小建议
- 不要把API密钥硬编码在代码里,最好用环境变量或者配置文件来管理,避免不小心泄露;
- 可以遵循PEP8命名规范,把方法名改成
search_for_keyword,变量名也用小写加下划线的形式,代码可读性会更好。
内容的提问来源于stack exchange,提问作者Season5Ryze
相关产品推荐
相关产品推荐

