试图使子类,但似乎没有工作:(

  • 本文关键字:工作 子类 python class oop
  • 更新时间 :
  • 英文 :


所以我基本上试图从duolingo api中获取一些数据,并通过一个类访问所有不同的部分(我认为这是使数据在其他文件中可访问的最好方法?)

我现在有这个代码:

class DuoData:
def __init__(self, username):
self.username = username
self.URL = "https://www.duolingo.com/2017-06-30/users?username={username}"
self.data = requests.get(self.URL.format(username=self.username))
self.data_json = self.data.json()
def get_streak(self):
return self.data_json['users'][0]['streak']
class ActiveLanguage:
def __init__(self, data_json):
super().__init__()
self.active_language = data_json['users'][0]['courses'][0]

def get_name(self):
return self.active_language['title']
def get_xp(self):
return self.active_language['xp']

def get_crowns(self):
return self.active_language['crowns']

get_streak函数工作得很好,所以

duo = DuoData("username")
print(duo.get_streak())

像我想要的那样打印条纹号,但下面的代码不起作用:print(duo.ActiveLanguage.get_name())

我想让duo.ActiveLanguage.getname()返回语言的名称,但它不像这样工作,我得到以下错误:TypeError: DuoData.ActiveLanguage.get_name()缺少1个必需的位置参数:'self'我已经尝试了很多不同的东西,这是我最好的方法,但它仍然不起作用,有人能帮助我吗?这是我第一次使用类(在Python中)我想也许子类不是正确的方法?

我的问题是:我可以有一个类或任何几个类别,每个有不同的值?比如:data.userdata.streak,data.userdata.id,data.activelanguage.name等等?

这就是创建子类的方法。子类意味着ActiveLanguageDuoData的一个特定类型。

然而,在这种特殊情况下,我不确定这是你想要的。您可能需要"封装",其中ActiveLanguage是一个独立的类,并使用DuoData的实例来完成其工作。

class DuoData:
def __init__(self, username):
self.username = username
self.URL = "https://www.duolingo.com/2017-06-30/users?username={username}"
self.data = requests.get(self.URL.format(username=self.username))
self.data_json = self.data.json()
def get_streak(self):
return self.data_json['users'][0]['streak']
class ActiveLanguage(DuoData)
def __init__(self, username):
super().__init__(username)
self.active_language = self.data_json['users'][0]['courses'][0]

def get_name(self):
return self.active_language['title']
def get_xp(self):
return self.active_language['xp']

def get_crowns(self):
return self.active_language['crowns']
duo = DuoData("username")
print(duo.get_streak())
acl = ActiveLanguage("username")
print(acl.get_streak())
print(acl.get_name())

首先,感谢Tim和Rhurwitz,我把你的代码放在一起,它神奇地工作了!这是代码:

import requests
class DuoData:
def __init__(self, username):
self.username = username
self.URL = "https://www.duolingo.com/2017-06-30/users?username={username}"
self.data = requests.get(self.URL.format(username=self.username))
self.data_json = self.data.json()
self.active = self.ActiveLanguage(self.data_json['users'][0]['courses'][0])
def get_streak(self):
return self.data_json['users'][0]['streak']
class ActiveLanguage:
def __init__(self, active_language):
self.active_language = active_language

def get_name(self):
return self.active_language['title']
def get_xp(self):
return self.active_language['xp']

def get_crowns(self):
return self.active_language['crowns']

duo = DuoData("Infinibyte")
print(duo.get_streak())
print(duo.active.get_name())
print(duo.active.get_xp())
print(duo.active.get_crowns())

它像我想要的那样工作。然而,我不明白我做了什么(子类,嵌套类,…Idk)所以任何解释都是受欢迎的;)

您确定要一个子类吗?如果activellanguage是DuoData的一个子类那么你实际上是在说activellanguage是多数据,这似乎不是你的意图。如果你的意图是说DuoData ' has ';那么你可能想使用复合而不是继承:

class ActiveLanguage:
def __init__(self, active_language):
self.active_language = active_language

def get_name(self):
return self.active_language['title']
def get_xp(self):
return self.active_language['xp']

def get_crowns(self):
return self.active_language['crowns']
class DuoData:
def __init__(self, username):
self.username = username
self.URL = "https://www.duolingo.com/2017-06-30/users?username={username}"
self.data = requests.get(self.URL.format(username=self.username))
self.data_json = self.data.json()
def get_streak(self):
return self.data_json['users'][0]['streak']
def get_active_language(self):
return ActiveLanguage(self.data_json['users'][0]['courses'][0])

duo = DuoData("username")
print(duo.get_streak())
acl = duo.get_active_language()
print(acl.get_name())
修改: 修复了一个剪切和粘贴错误
return self.ActiveLanguage(self.data_json['users'][0]['courses'][0])

:

return ActiveLanguage(self.data_json['users'][0]['courses'][0])

感谢@Tim和@Infinibyte发现了它。

最新更新