如何打印此类变量?

时间:2015-10-01 07:22:05

标签: python class

如果我尝试打印作为列表的类变量,我会得到一个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__方法中的格式不适用于此。

3 个答案:

答案 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能够打印该值。