首页 > 解决方案 > 如何根据 Google Sheets API 正确打印对象列表属性?

问题描述

我是 Python 新手,不熟悉使用列表而不是数组。我正在尝试专门打印包含在相同类型对象列表中的对象的一个​​属性。

我正在阅读strrepr之间的一些差异,因为str没有打印我想要的内容。我读到两者都应该定义,即使它们完全相同。当我现在输出时,我得到以下信息:

<bound method MacAuth.__str__ of XXXXXXXXXXXX>
<bound method MacAuth.__str__ of XXXXXXXXXXXX>
<bound method MacAuth.__str__ of XXXXXXXXXXXX>

XXXXXXXXXX 实际上显示了正确的属性,并且正是我想看到的。我不需要输出线的其余部分。

此外,此信息是从 Google Sheets API 作为 cell.value() 读取的,所以我不确定这是否会导致问题。

class MacAuth():

    def __init__(self, mac_address):
        self.mac_address = mac_address
        self.registerd_user = 'registerd_user'

    def __str__(self):
        return self.mac_address

    def __repr__(self):
        return self.mac_address

mac_list = list()
for i in range(start, end):
    mac = sheet.cell(i,2).value
    mac_list.append(MacAuth(mac))

for i in range(0,3):
    print(mac_list[i].__str__, sep='\n')

标签: pythongoogle-sheets

解决方案


查看. _ _ str()相关部分:

str(object)return object.__str__(),这是对象的“非正式”或可很好打印的字符串表示形式。对于字符串对象,这是字符串本身。如果 object 没有__str__()方法,则str()回退到返回repr(object)

同样,repr()调用__repr__().

从上的文档print()

所有非关键字参数都像 dos 一样转换为字符串str()并写入流

所以print(obj)行为类似于str(obj),除了它写入流而不是返回值。这意味着您的解决方案最终比您想象的要简单:

# you can iterate over the list directly
for mac_auth in mac_list:
    # sep='\n' is the default value, so you don't need to specify it 
    print(mac_auth)

作为旁注,您目前看到此内容的原因是:

<bound method MacAuth.__str__ of XXXXXXXXXXXX>

是因为该方法MacAuth.__str__也是一个对象,定义了自己的字符串表示,print并将该方法转换为字符串。

绑定方法的表示包括对它们绑定到的对象的引用,在本例中为MacAuth对象。流程将与此类似:

  1. print()尝试将__str__绑定到对象的方法(它本身就是一个对象)MacAuth转换为字符串
  2. __str__的字符串表示形式包括它所绑定的对象,例如<bound method MacAuth.__str__ of [MacAuth obj]>
  3. 要打印该[MacAuth obj]部分,__str__调用该对象,它会根据需要返回mac_address属性

推荐阅读