【问题标题】:Printing a class attribute instead of its memory address? [duplicate]打印类属性而不是其内存地址? [复制]
【发布时间】:2020-04-23 10:19:18
【问题描述】:

为了知识起见,想打印这段代码的类属性列表all_contacts的内容:

class Contact:
    all_contacts = []

    def __init__(self,name,email):
        self.name = name
        self.email = email
        Contact.all_contacts.append(self)

但是,我所有的尝试都会导致内存地址:

>>> c = Contact("Some Body", "somebody@example.net")
>>> c2 = Contact("Some Body 2", "somebody2@example.net")

>>> Contact.all_contacts
[<__main__.Contact object at 0x0000000002C8CF48>]

>>> print(Contact.all_contacts)
[<__main__.Contact object at 0x0000000002C8CF48>]

>>> c.all_contacts
[<__main__.Contact object at 0x0000000002C8CF48>]

如何打印这个类属性以便查看它的元素?

【问题讨论】:

  • 您正在打印它。您将self 添加到all_contacts 和Contact,打印时为&lt;__main__.Contact object at 0x0000000002C8CF48&gt;,因为您没有为Contact 定义__str__ 或__repr__。请注意输出周围的[],表明它正在打印一个列表。

标签: python class oop


【解决方案1】:

你只需要根据需要实现__repr__():

class Contact:
    all_contacts = []

    def __init__(self, name, email):
        self.name = name
        self.email = email
        Contact.all_contacts.append(self)
    def __repr__(self):
        return f"Name:{self.name} Email:{self.email}"

c = Contact("Some Body", "somebody@example.net")
c2 = Contact("Some Body 2", "somebody2@example.net")

print( Contact.all_contacts)

输出:

[Name:Some Body Email:somebody@example.net, Name:Some Body 2 Email:somebody2@example.net]

【讨论】:

  • 如果您使用的是 Python 3.8+,您可以使用以下 f-string 来获得相同的输出,同时编写更少的代码:&lt;Contact {self.name=} {self.email=}&gt;
猜你喜欢
  • 1970-01-01
  • 2020-01-18
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多