【问题标题】:OOP - Accessing Object DataOOP - 访问对象数据
【发布时间】:2017-01-01 18:50:51
【问题描述】:

如果这是一个重复或简单的问题,我们深表歉意。

我最近一直在学习 Python(多年来一直在编写简单的 MATLAB 脚本)。我已经开始探索面向对象编程和 JSON。

我正在尝试使用 API 从服务器收集数据。当返回对象时,我主要使用语法访问特定数据字段做得很好。但是,我正在努力解决一个问题。我有一个行对象:

row = {"totalCount": 1, "results": [{"parentObjectId": 887, "contextData": ["Row 1"], "parentObjectType": "sheet", "objectId": 599, "text": "Text", "parentObjectName": "Data", "objectType": "row"}]}

我正在尝试访问单个结果 (result[0]) 的“objectId”属性。

我尝试过rowId = row.results[0].objectId,但得到错误“'SearchResultItem' object has no attribute 'objectId'”。

我也尝试过rowId = row.results[0]['objectId'],但得到错误“'SearchResultItem' object has no attribute '__getitem__'”。

--- 编辑:

print(reportingRow.results[0]['objectId'])
Traceback (most recent call last):

  File "<ipython-input-46-14e026c273e3>", line 1, in <module>
   print(reportingRow.results[0]['objectId'])

TypeError: 'SearchResultItem' object has no attribute '__getitem__'

我正在使用一个名为 Smartsheet 的工具。我正在使用 search_sheet 请求。 API 文档 (http://smartsheet-platform.github.io/api-docs/#search-sheet) 说“SearchResultItem”是一个包含许多属性的对象。它没有提供更多信息。

Smartsheet 模型可在此处找到:https://github.com/smartsheet-platform/smartsheet-python-sdk/tree/master/smartsheet/models。我目前正在查看 search_result.py 和 search_result_item.py 以找到答案/线索。

--- 编辑结束

感谢您的帮助!

【问题讨论】:

  • 您的对象不是字典(它只是打印时看起来像的东西)。您的错误清楚地表明它是SearchResultItem。我们不知道SearchResultItem 实现了什么样的接口,因此我们无法为您提供帮助。
  • 告诉我们SearchResultItem是什么,它不是json字符串也不是dict。
  • 请提供您从哪里获取数据的 API 的完整响应,然后让我们知道哪里出了问题。
  • 我已经编辑了原始帖子以尝试回答您的问题。

标签: python oop smartsheet-api


【解决方案1】:

您的库代码清楚地表明,SearchResultItem 具有 a property .object_id

print(reportingRow.results[0].object_id)  # this works just fine

您的问题与字典/JSON 无关,因为您没有使用字典。您正在使用包裹在这些字典周围的自定义对象。

【讨论】:

  • 谢谢卢卡斯。我缺乏知识/经验意味着这对我来说并不明显。出于兴趣,是否有任何理由在我打印行时显示“objectId”作为属性而“object_id”用于访问数据?
  • 供将来参考:Smartsheet API 文档中描述的任何属性(未专门出现在 Python 代码示例中)表示属性在原始 API (JSON) 请求/响应中的显示方式。 Python SDK 本身使用 Python 变量命名约定:“为提高可读性所必需的用下划线分隔单词的小写字母”(如此处所述:python.org/dev/peps/pep-0008)。例如,原始 API 响应可能包含属性“modifiedAt”——但当通过 Python SDK 使用此属性时,您将其称为“modified_at”。
  • 谢谢金。令人困惑的是,对于某些对象,原始 API 响应中的属性可用于访问数据。也许以前我只使用单个单词的属性,因此 Python 命名约定和原始 API 响应匹配。
【解决方案2】:

请尝试:

rowId = row['results'][0]['objectId']

【讨论】:

  • 显然不是——OP的对象不是字典。
  • 我已经尝试过了,但它不起作用。不过还是谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 2013-04-26
  • 2015-05-19
  • 2020-06-12
  • 2012-07-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
相关资源
最近更新 更多