如果我尝试打印作为列表的类变量,我会得到一个Python对象。 (这些是我在stackoverflow上找到的例子。)
class Contacts:
all_contacts = []
def __init__(self, name, email):
self.name = name
self.email = email
Contacts.all_contacts.append(self)
def __str__(self):
return '%s, <%s>' % (self.name, self.email)
c1 = Contacts("Grace", "something@hotmail.com")
print(c1.all_contacts)
[<__main__.Contact object at 0x0287E430>, <__main__.Contact object`
但在这个更简单的例子中,它实际上是打印出来的:
class Example():
samplelist= [1,2,3]
test= Example()
print (test.samplelist)
[1, 2, 3]
我认为这一行是第一个示例代码中的罪魁祸首:Contact.all_contacts.append(self)
。但我不确定这里发生了什么。
修改
有几位用户告诉我只需追加self.name
而非self
。
所以当我这样做时:
class Contacts:
all_contacts = []
def __init__(self, name, email):
self.name = name
self.email = email
Contacts.all_contacts.append(self.name)
Contacts.all_contacts.append(self.email)
def __str__(self):
return '%s, <%s>' % (self.name, self.email)
def __repr__(self):
return str(self)
c1 = Contacts("Paul", "something@hotmail.com")
c2 = Contacts("Darren", "another_thing@hotmail.com")
c3 = Contacts("Jennie", "different@hotmail.com")
print(Contacts.all_contacts)
我明白了:
['Paul', 'something@hotmail.com', 'Darren', 'another_thing@hotmail.com', 'Jennie', 'different@hotmail.com']
而不是:
[Paul, <something@hotmail.com>, Darren, <another_thing@hotmail.com>, Jennie, <different@hotmail.com>]
因此,__str__
方法中的格式不适用于此。
答案 0 :(得分:13)
当您打印列表时,它会调用__str__
列表,但列表会在内部调用__repr__()
作为其元素。您也应该为您的班级实施__repr__()
。示例 -
class Contacts:
all_contacts = []
def __init__(self, name, email):
self.name = name
self.email = email
Contacts.all_contacts.append(self)
def __str__(self):
return '%s, <%s>' % (self.name, self.email)
def __repr__(self):
return str(self)
演示 -
class Contacts:
all_contacts = []
def __init__(self, name, email):
self.name = name
self.email = email
Contacts.all_contacts.append(self)
def __str__(self):
return '%s, <%s>' % (self.name, self.email)
def __repr__(self):
return str(self)
contact1 = Contacts("Grace1", "something1@hotmail.com")
contact2 = Contacts("Grace2", "something2@hotmail.com")
contact3 = Contacts("Grace3", "something3@hotmail.com")
print(Contacts.all_contacts)
结果 -
[Grace1, <something1@hotmail.com>, Grace2, <something2@hotmail.com>, Grace3, <something3@hotmail.com>]
此外,从输出中看起来列表实际上有6
个元素,因此您应该考虑更改__repr__
返回。
答案 1 :(得分:3)
您的代码构造了一个对象列表:
Contacts.all_contacts.append(self)
因为self是一个对象,并被附加到all_contacts列表..
如果您想要不同的东西,请在all_contacts列表中附加不同的内容。
答案 2 :(得分:2)
python只会为列表对象(all_contacts)调用 str ,而不是列表中的每个项目。
对于内置类型,python能够打印该值。