我有一个类,该类的属性由几个列表组成(今天为8,但是它肯定会增长,因为我的代码依赖于另一个项目的prod上使用的先前代码)
该类具有__str__
函数,用于打印列表的漂亮信息。今天,该函数显示有关每个列表的信息,但是会调用它们,我不喜欢那样,因为每次我的类属性发生更改(添加/删除列表)时,我都必须更新此方法
我正在寻找一种动态迭代类属性以显示信息的方法
作为一个例子,让我们想象下面的类
class shopping_cart:
def __init__(self):
self.fruits = []
self.vegetables = []
self.meat = []
self.bread = []
def __str__(self):
msg = ""
msg += "shopping cart content\n"
msg += "---------------------\n"
msg += "---fruits-----------: " + len(self.fruits) +"\n
msg += "---vegetables-------: " + len(self.vegetables) +"\n
msg += "---meat-------------: " + len(self.meat) +"\n
msg += "---bread------------: " + len(self.bread) +"\n
return msg
您可以看到维护成本很高。我正在寻找更动态的东西,看起来更像
class shopping_cart:
def __init__(self):
self.fruits = []
self.vegetables = []
self.meat = []
self.bread = []
def __str__(self):
msg = ""
msg += "shopping cart content\n"
msg += "---------------------\n"
for item in <list of my class attributes>:
msg += "---" + item +"-----------: " + len(item) +"\n
return msg
易于阅读且易于维护。
答案 0 :(得分:1)
我认为您正在寻找的一种功能是dir
和getattr
。这是示例
class shopping_cart:
def __init__(self):
self.fruits = []
self.vegetables = []
self.meat = []
self.bread = []
def __str__(self):
msg = ""
msg += "shopping cart content\n"
msg += "---------------------\n"
members = [attr for attr in dir(self) if not callable(getattr(self, attr)) and not attr.startswith("__")]
for item in members:
msg += "---" + item +"-----------: " + str(getattr(self,item) )+"\n"
return msg
答案 1 :(得分:1)
您可以通过以下几种方式做到这一点:
1-使用类的__dict__属性。这样就为您提供了所有变量的字典对象,您可以遍历它们
s = shopping_cart()
s.__dict__
应该输出类似
的内容{'fruits':[], 'vegetables':[], ... }
2-您可以使用列表字典,而不是一堆列表,然后在字典上进行迭代。
3-您还可以使用列表列表(例如[self.fruits,self.vegetables ...],并对其进行迭代。
答案 2 :(得分:1)
您可以在类的实例上使用内置的vars()
函数(而不是class
本身):
class ShoppingCart:
def __init__(self):
self.fruits = []
self.vegetables = []
self.meat = []
self.bread = []
def __str__(self):
msg = "shopping cart contents\n"
msg += "----------------------\n"
for attrname in vars(self):
value = getattr(self, attrname)
if isinstance(value, list):
msg += "---{}{}: {:2}\n".format(
attrname, '-'*(15-len(attrname)), len(value))
return msg
cart = ShoppingCart()
print(cart)
输出:
shopping cart contents
----------------------
---fruits---------: 0
---vegetables-----: 0
---meat-----------: 0
---bread----------: 0