这是我正在处理的代码。我创建了一些用户,给他们一个名称,姓氏和值。
是否有一种方法可以返回并打印所有(例如,我创建的每个用户的姓名)?
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
有可能吗?
谢谢您的时间。
答案 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)