有没有办法打印在__init__方法中创建的对象的所有参数?

时间:2019-05-11 23:32:01

标签: python python-3.x class

这是我正在处理的代码。我创建了一些用户,给他们一个名称,姓氏和值。

是否有一种方法可以返回并打印所有(例如,我创建的每个用户的姓名)?

class Bacheca:

    def __init__(self, name, surname, value):
        self.name = name
        self.surname = surname
        self.value = value

user1 = Bacheca("John", "Black", 1)
user2 = Bacheca("Mark", "Green", 2)
user3 = Bacheca("Phil", "White", 3)

例如,我要打印的是每个用户的所有姓名:

John 
Mark
Phil

有可能吗?

谢谢您的时间。

2 个答案:

答案 0 :(得分:2)

如果要在对象本身中执行此操作,请结合使用类变量和静态方法:

class Bacheca:

    created_users = []

    def __init__(self, name, surname, value):
        self.name = name
        self.surname = surname
        self.value = value
        Bacheca.created_users.append(self)

    @staticmethod
    def created():
        return Bacheca.created_users

user1 = Bacheca("John", "Black", 1)
user2 = Bacheca("Mark", "Green", 2)
user3 = Bacheca("Phil", "White", 3)
print([user.name for user in Bacheca.created()])

输出:

['John', 'Mark', 'Phil']

每次调用__init__(用于初始化新实例)时,创建的对象都会附加到created_users(它是 class 的变量)中,如下所示:反对实例。因此,它持久保存对已创建的每个实例的引用。

您可以通过覆盖__del__来添加更多的花哨功能,但这可能超出了本问题的范围。

答案 1 :(得分:1)

另一个答案是创造性的解决方案,我将来可能会用到,但应谨慎使用。如注释中所述,它将保留对您的类实例的引用,因此垃圾收集器不会正确删除它们(即,直到最后一个实例未使用之前,所有的类实例都不会被删除[即使那样,它也可能表现得很时髦,但不会正确删除])。有很多解决方法(例如weakref或使用__del__魔术方法),但是如果您是新手,我可能会避免使用它。如果您只需要一个列表,请创建一个列表:

users = []
users.append(Bacheca("John", "Black", 1))
users.append(Bacheca("Mark", "Green", 2))
users.append(Bacheca("Phil", "White", 3))

for user in users:
    print(user.name)
# or
print([user.name for user in users])

如果您对自己的课程没有做任何其他事情,而只是使用它来将属性分组在一起,那么您可能想使用namedtuple

from collections import namedtuple
Bacheca = namedtuple('Bacheca', 'name surname value')

# it acts the same as your class
users = []
users.append(Bacheca("John", "Black", 1))
users.append(Bacheca("Mark", "Green", 2))
users.append(Bacheca("Phil", "White", 3))

for user in users:
    print(user.name)