【问题标题】:Python - Dynamically appending object dataPython - 动态附加对象数据
【发布时间】:2020-11-01 07:36:06
【问题描述】:

您好,我正在使用来自以这种格式输出的 API 的数据(跨越大量行的示例,仅显示 2)

['347759', '98', '50752599'] 
['426291', '84', '3092962']

每条线代表游戏中的不同技能,每条数据代表玩家在该技能中的排名、他们在该技能中的等级以及他们在该技能中的总经验值 例如,如果第一个技能是挖掘,第二个技能是锻造,那么格式化数据将是

Mining : rank=347759 , level = 98 , xp = 50752599

Smithing : rank=426291, level = 84, xp = 3092962

我使用 http 请求来获取此数据,它跨越多行,目前我使用此代码(见下文)将数据分离成每行上的单独整数

line_count = 0
for line in data_processed:
    if line != '':
        skill_data = line.split(',')
        player.mining.rank = skill_data[0]
        player.mining.level = skill_data[1]
        player.mining.xp = skill_data[2]
        line_count = line_count + 1

显然问题在于,当它移动到文件中的下一行(ints 的第二个三重奏)而不是 player.mining.rank = skill_data[0] 等时,我将需要 player.smithing.rank = skill_data[0] 等 24 条不同的行(如那里是游戏中的 24 种不同技能)。

我将如何动态地从附加一个类对象如“mining”(源自“Skills”类并在“Player”对象下声明)切换到另一个类对象如“smithing”

欢迎任何建议 - 如果您需要更多解释或上下文,请发表评论 - 我会尽快回复

我知道我可以使用它(见下文),但问题是我有多个玩家从多个 http 请求中调用,因此它将跨越数百行代码,所有代码都非常相似,只是对象名称不同

if line_count == 1: player.mining.rank = skill_data[0]if line_count == 2: player.smithing.rank = skill_data[0]

对于每个玩家,对象是他们的角色名称,例如Conial = Player(...)

【问题讨论】:

  • 您还可以发布您提到的要将数据转换到的类吗? IE。 PlayerSkills
  • 为您编辑并添加了照片和另一行文字
  • 当您从您的 API 接收数据时,您如何知道哪一行对应于哪个技能?
  • 在 API 规范下显示返回的数据包含每个技能 1 的 Rank Level Experience,然后是技能 2 的 Rank Level Experience,依此类推,所有技能以 \n 分隔并用“,”分隔每个值 - api 规范中给出了一个示例,可以在此处找到runescape.wiki/w/…,然后单击内容选项卡下的 old school hiscores

标签: python class object dynamic


【解决方案1】:

你可以dinamically obtain an object's attribute based on a string

也就是说,假设您将玩家技能列表作为字符串:

skills = ['mining', 'crafting', 'fishing', ... ]

您可以稍微更改一下代码:

line_count = 0
for line in data_processed:
    if line != '':
        skill_data = line.split(',')
        playerSkill = getattr(player, skills[line_count])
        playerSkill.rank = skill_data[0]
        playerSkill.level = skill_data[1]
        playerSkill.xp = skill_data[2]
        
        line_count = line_count + 1

【讨论】:

  • 所以在 for 循环上方,如果定义了 player = player1, playerSkill.rank 是否是指向 player1.mining.rank 内存位置的指针(挖掘是基于 line_count 的技能示例)
  • 是的。 Runescape 顺便说一句?
  • 是的,它的 runescape :),我会测试你的答案,如果它有效,那么我会让你知道并接受答案
  • 太棒了,这工作绝对完美,非常感谢,我的目标是制作一个不和谐的 webhook,当有人获得关卡等或完成线索滚动时会显示
猜你喜欢
  • 1970-01-01
  • 2012-03-27
  • 2012-01-31
  • 2012-07-13
  • 2023-03-08
  • 2018-04-18
  • 2016-07-31
  • 2017-10-09
相关资源
最近更新 更多