如何根据Google Sheets API正确打印对象列表属性?

时间:2019-03-28 02:42:56

标签: python google-sheets

我是Python的新手,对使用列表而不是数组没有经验。我试图专门打印包含在同一类型的对象列表中的对象的一个​​属性。

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

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

XXXXXXXXXX实际显示正确的属性以及我想看到的内容。我不需要输出线的其余部分。

此外,该信息是作为单元格(。)从Google Sheets API读取的,因此我不确定这是否会引起问题。

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')

2 个答案:

答案 0 :(得分:0)

如果您call正在打印的方法,您将获得字符串值:

print(mac_list[i].__str__(), sep='\n')

答案 1 :(得分:0)

看看str()的{​​{3}}。相关部分:

  

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

类似地,repr()调用__repr__()

print()上的docs

  

所有非关键字参数都像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属性