python __init__() 需要 1 个位置参数,但有 2 个是新手
Posted
技术标签:
【中文标题】python __init__() 需要 1 个位置参数,但有 2 个是新手【英文标题】:python __init__() takes 1 positional argument but 2 were given newbie 【发布时间】:2021-04-26 02:30:27 【问题描述】:我在尝试运行的一个小 spotify-api 程序中有一个属性错误
我的运行文件包含以下内容
import os
from spotify_client import AddSongs
def run():
spotify_client = AddSongs('spotify_token')
random_tracks = spotify_client.get_random_tracks()
track_ids = [track['id'] for track in random_tracks]
was_added_to_queue = spotify_client.add_tracks_to_queue()
if was_added_to_queue:
for track in random_tracks:
print(f"Added track['name'] to your library")
if __name__ == '__main__':
run()
那么在 spotify_client 中是下面的类
class AddSongs(object):
def __init__(self,):
self.spotify_token = ""
self.uri = ""
def get_random_tracks(self):
wildcard = f'%random.choice(string.ascii_lowercase)%'
query = urllib.parse.quote(wildcard)
offset = random.randint(0, 2000)
url = f"https://api.spotify.com/v1/search?q=query&offset=offset&type=track&limit=1"
response = requests.get(
url,
headers=
"Content-Type": "application/json",
"Authorization": f"Bearer self.spotify_token"
)
response_json = response.json()
print(response)
tracks = [
track for track in response_json['tracks']['items']
]
self.uri = response_json["tracks"]["items"][0]["uri"]
print(f'Found len(tracks) tracks to add to your queue')
return tracks
return self.uri
def add_tracks_to_queue(self,):
print('adding to queue...')
url =f"https://api.spotify.com/v1/me/player/queue?uri=self.uri"
response = requests.post(
url,
headers=
"Content-Type": "application/json",
"Authorization": f"Bearer self.spotify_token"
)
print(f"Added track['name'] to your queue")
return response.ok
def callrefresh(self):
print("Refreshing token")
refreshCaller = Refresh()
self.spotify_token = refreshCaller.refresh()
self.get_random_tracks()
a = AddSongs()
a. callrefresh()
如您所见,它可以正常运行代码,直到 add_tracks_to_queue 这给了我以下回溯
Refreshing token
<Response [200]>
Found 1 tracks to add to your queue
Traceback (most recent call last):
File "/Users/shakabediako/Documents/free_streams/run.py", line 18, in <module>
run()
File "/Users/shakabediako/Documents/free_streams/run.py", line 7, in run
spotify_client = AddSongs('spotify_token')
TypeError: __init__() takes 1 positional argument but 2 were given
>>>
我知道关于这个错误有多个线程,但在阅读了其中大部分之后,我无法理解这个概念或找到答案。 我认为这与我从另一个文件调用函数有关,但我不明白为什么这会创建另一个“位置参数” 我知道这一点,因为如果我只运行 spotify_client 文件,我会得到以下响应
Refreshing token
<Response [200]>
Found 1 tracks to add to your queue
>>>
这只是我在 def add_tracks_to_queue 之前的打印值(我也不明白为什么它没有运行)
我真的希望有人可以帮助我 提前致谢
【问题讨论】:
AddSongs('spotify_token')
和 AddSongs.__init__(self,):
你看到问题了吗?
按照惯例,类名通常是名词,方法名是动词。你的AddSongs
类看起来代表一个 Spotify 帐户;添加歌曲是您可以在与帐户关联的播放列表上执行的操作。
【参考方案1】:
您的 AddSongs
类不接受任何变量作为输入(__init__
中还有一个似乎没有任何用途的逗号):
class AddSongs(object):
def __init__(self,):
但你调用它时好像它确实接受一个变量:
spotify_client = AddSongs('spotify_token')
self
参数必须在其中,但如果您想接受任何其他变量,则需要实际定义它们。因此解决方案可能是添加一个token
参数:
class AddSongs(object):
def __init__(self, token=""): # defaults to an empty string if token is not passed in
self.spotify_token = token
这样,如果您调用 AddSongs('spotify_token')
,类的 self.spotify_token
将设置为 'spotify_token'
。
【讨论】:
以上是关于python __init__() 需要 1 个位置参数,但有 2 个是新手的主要内容,如果未能解决你的问题,请参考以下文章
初始化 kivy 屏幕时遇到困难,TypeError: __init__() 需要 1 个位置参数,但给出了 2 个
__ init __()接受1个位置参数,但在对标记添加Latex支持时给出了2个位置参数
TypeError: __init__() 接受 1 个位置参数,但给出了 2 个
TypeError: __init__() 接受 1 个位置参数,但给出了 3 个