__str__方法遍历类属性

时间:2019-05-17 19:56:37

标签: python string class attributes

我有一个类,该类的属性由几个列表组成(今天为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

易于阅读且易于维护。

3 个答案:

答案 0 :(得分:1)

我认为您正在寻找的一种功能是dirgetattr。这是示例

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