我是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')
答案 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
对象。流程类似于此:
print()
尝试将绑定到__str__
对象的方法MacAuth
(本身就是对象)转换为字符串__str__
的字符串表示形式包括与其绑定的对象,类似于<bound method MacAuth.__str__ of [MacAuth obj]>
[MacAuth obj]
部分,将调用该对象的__str__
,并根据需要返回mac_address
属性