如何根据谷歌表格API正确打印对象列表属性?



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

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

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX不过,我不需要输出行的其余部分。

此外,此信息是从 Google 表格 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')

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

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

看看str()的文档。相关部分:

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

同样,repr()调用__repr__()

print()上的文档:

所有非关键字参数都像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()尝试将绑定到MacAuth对象的方法__str__(本身就是一个对象)转换为字符串
  2. __str__的字符串表示包括它绑定到的对象,类似于<bound method MacAuth.__str__ of [MacAuth obj]>
  3. 若要打印[MacAuth obj]部分,将调用该对象的__str__,这将根据需要返回mac_address属性

最新更新