it-swarm.com.de

Gibt alle Eigenschaften einer Python Klasse aus

Ich habe eine Klasse Animal mit mehreren Eigenschaften wie:


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...

Ich möchte jetzt alle diese Eigenschaften in eine Textdatei drucken. Die hässliche Art, wie ich es jetzt mache, ist wie folgt:


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,)

Gibt es eine bessere Pythonic-Methode, um dies zu tun?

143
Idr

In diesem einfachen Fall können Sie vars() verwenden:

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())

Wenn Sie Python Objekte auf der Festplatte speichern möchten, sollten Sie shelve - Python Objektpersistenz .

260
Jochen Ritzel

Eine andere Möglichkeit besteht darin, die Funktion dir() aufzurufen (siehe 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']

Beachten Sie, dass dir() versucht, jedes Attribut zu erreichen, das erreichbar ist.

Dann können Sie auf die Attribute zugreifen, z. durch Filtern mit doppelten Unterstrichen:

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

Dies ist nur ein Beispiel dafür, was mit dir() möglich ist. Bitte überprüfen Sie die anderen Antworten, um die richtige Vorgehensweise zu finden.

67
Zaur Nasibov

Vielleicht suchen Sie so etwas?

    >>> class MyTest:
        def __init__ (self):
            self.value = 3
    >>> myobj = MyTest()
    >>> myobj.__dict__
    {'value': 3}
54
Urjit

try 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)

Ausgabe:

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

Hier ist der vollständige Code. Das Ergebnis ist genau das, was Sie wollen.

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 __== '__main__':
    animal = Animal()
    temp = vars(animal)
    for item in temp:
        print item , ' : ' , temp[item]
        #print item , ' : ', temp[item] ,
6
JaeWoo So

Versuchen Sie es einfach mit beeprint

es gibt so etwas aus:

instance(Animal):
    legs: 2,
    name: 'Dog',
    color: 'Spotted',
    smell: 'Alot',
    age: 10,
    kids: 0,

Ich denke ist genau das, was du brauchst.

3
Anyany Pan