关于oop:打印Python类的所有属性

Print all properties of a Python Class

本问题已经有最佳答案,请猛点这里访问。

我有一个类动物有几个特性,比如:

1
2
3
4
5
6
7
8
9
class Animal(object):
    def __init__(self):
        self.legs = 2
        self.name = 'Dog'
        self.color= 'Spotted'
        self.smell= 'Alot'
        self.age  = 10
        self.kids = 0
        #many more...

现在我要将所有这些属性打印到文本文件中。我现在做这件事的丑陋方式是:

1
2
animal=Animal()
output = 'legs:%d, name:%s, color:%s, smell:%s, age:%d, kids:%d' % (animal.legs, animal.name, animal.color, animal.smell, animal.age, animal.kids,)

有没有更好的方法来做这个?


在这个简单的例子中,您可以使用vars()

1
2
3
4
5
an = Animal()
attrs = vars(an)
# {'kids': 0, 'name': 'Dog', 'color': 'Spotted', 'age': 10, 'legs': 2, 'smell': 'Alot'}
# now dump this in some way or another
print ', '.join("%s: %s" % item for item in attrs.items())

如果您想在磁盘上存储python对象,那么应该查看shelve-python对象持久性。


另一种方法是调用dir()函数(参见https://docs.python.org/2/library/functions.html dir)。

1
2
3
4
5
6
7
a = Animal()
dir(a)  
>>>
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
 '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
 '__weakref__', 'age', 'color', 'kids', 'legs', 'name', 'smell']

注意,dir()试图到达任何可能到达的属性。

然后,您可以访问这些属性,例如,通过使用双下划线过滤:

1
2
attributes = [attr for attr in dir(a)
              if not attr.startswith('__')]

这只是一个可以用dir()做什么的例子,请检查其他答案以获得正确的方法。


也许你在找这样的东西?

1
2
3
4
5
6
    >>> class MyTest:
        def __init__ (self):
            self.value = 3
    >>> myobj = MyTest()
    >>> myobj.__dict__
    {'value': 3}


试一下技巧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from ppretty import ppretty


class Animal(object):
    def __init__(self):
        self.legs = 2
        self.name = 'Dog'
        self.color= 'Spotted'
        self.smell= 'Alot'
        self.age  = 10
        self.kids = 0


print ppretty(Animal(), seq_length=10)

输出:

1
__main__.Animal(age = 10, color = 'Spotted', kids = 0, legs = 2, name = 'Dog', smell = 'Alot')


这是完整的代码。结果就是你想要的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Animal(object):
    def __init__(self):
        self.legs = 2
        self.name = 'Dog'
        self.color= 'Spotted'
        self.smell= 'Alot'
        self.age  = 10
        self.kids = 0

if __name__ == '__main__':
    animal = Animal()
    temp = vars(animal)
    for item in temp:
        print item , ' : ' , temp[item]
        #print item , ' : ', temp[item] ,

试一下哔哔声

它打印的内容如下:

1
2
3
4
5
6
7
instance(Animal):
    legs: 2,
    name: 'Dog',
    color: 'Spotted',
    smell: 'Alot',
    age: 10,
    kids: 0,

我想这正是你需要的。