打印Python类的所有属性
我有一个类动物与几个属性,如:
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...
我现在要打印所有这些属性到一个文本文件。 我现在做的丑陋的方式是:
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,)
有没有更好的Pythonic方法来做到这一点?
在这种简单的情况下,你可以使用vars()
:
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对象存储在磁盘上,你应该看看搁置 – Python对象的持久性 。
另一种方法是调用dir()
函数(请参阅https://docs.python.org/2/library/functions.html#dir )。
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()
试图达到任何可能达到的属性。
然后你可以通过双下划线过滤来访问属性:
attributes = [attr for attr in dir(a) if not attr.startswith('__')]
这只是dir()
可能做的一个例子,请检查其他答案是非常好的pythonic方法:)
也许你正在寻找这样的东西?
>>> class MyTest: def __init__ (self): self.value = 3 >>> myobj = MyTest() >>> myobj.__dict__ {'value': 3}
尝试ppretty :
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)
输出:
__main__.Animal(age = 10, color = 'Spotted', kids = 0, legs = 2, name = 'Dog', smell = 'Alot')
这是完整的代码。 结果正是你想要的。
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] ,
试试吧,
它打印这样的东西:
instance(Animal): legs: 2, name: 'Dog', color: 'Spotted', smell: 'Alot', age: 10, kids: 0,
我认为正是你需要的。