我是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
对象。流程将类似于以下内容:
print()
尝试将绑定到MacAuth
对象的方法__str__
(本身就是一个对象)转换为字符串__str__
的字符串表示包括它绑定到的对象,类似于<bound method MacAuth.__str__ of [MacAuth obj]>
- 若要打印
[MacAuth obj]
部分,将调用该对象的__str__
,这将根据需要返回mac_address
属性