wake-up-neo.net

Listet Attribute eines Objekts auf

Gibt es eine Möglichkeit, eine Liste von Attributen abzurufen, die in Instanzen einer Klasse vorhanden sind?

class new_class():
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

a = new_class(2)
print(', '.join(a.SOMETHING))

Das gewünschte Ergebnis ist, dass "multi, str" ausgegeben wird. Ich möchte, dass die aktuellen Attribute aus verschiedenen Teilen eines Skripts angezeigt werden.

195
MadSc13ntist
>>> class new_class():
...   def __init__(self, number):
...     self.multi = int(number) * 2
...     self.str = str(number)
... 
>>> a = new_class(2)
>>> a.__dict__
{'multi': 4, 'str': '2'}
>>> a.__dict__.keys()
dict_keys(['multi', 'str'])

Sie können auch pprint hilfreich finden.

205
Roger Pate
dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__

Dann können Sie testen, welcher Typ mit type() oder ob eine Methode mit callable() ist.

124
mkotechno

vars(obj) gibt die Attribute eines Objekts zurück.

50
rohithpr
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'

Dadurch werden selbstverständlich alle Methoden oder Attribute in der Klassendefinition gedruckt. Sie können "private" Methoden ausschließen, indem Sie i.startwith('__') in i.startwith('_') ändern.

26
SilentGhost

Das inspect Modul bietet einfache Möglichkeiten, ein Objekt zu inspizieren: 

Das Inspect-Modul bietet mehrere nützliche Funktionen, mit denen Sie Informationen über Live-Objekte wie Module, Klassen, Methoden, Funktionen, Tracebacks, Rahmenobjekte und Codeobjekte. 


Mit getmembers() können Sie alle Attribute Ihrer Klasse mit ihrem Wert sehen. Um private oder geschützte Attribute auszuschließen, verwenden Sie .startswith('_'). Um Methoden oder Funktionen auszuschließen, verwenden Sie inspect.ismethod() oder inspect.isfunction()

import inspect


class NewClass(object):
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

    def func_1(self):
        pass


a = NewClass(2)

for i in inspect.getmembers(a):
    # Ignores anything starting with underscore 
    # (that is, private and protected attributes)
    if not i[0].startswith('_'):
        # Ignores methods
        if not inspect.ismethod(i[1]):
            print(i)

Beachten Sie, dass ismethod() für das zweite Element von i verwendet wird, da das erste Element lediglich eine Zeichenfolge (dessen Name) ist. 

Offtopic: Verwenden Sie CamelCase für Klassennamen.

21
Fermi paradox

Es wird oft erwähnt, dass Sie dir() verwenden sollten, um eine vollständige Liste der Attribute aufzulisten. Beachten Sie jedoch, dass dir() entgegen der landläufigen Meinung keine all Attribute hervorbringt. Beispielsweise stellen Sie möglicherweise fest, dass __name__ In der dir() -Auflistung einer Klasse fehlt, obwohl Sie über die Klasse selbst darauf zugreifen können. In der Dokumentation zu dir() ( Python 2 , Python ):

Da dir () in erster Linie als Annehmlichkeit für die Verwendung an einer interaktiven Eingabeaufforderung bereitgestellt wird, wird mehr versucht, eine interessante Gruppe von Namen als eine rigoros oder konsistent definierte Gruppe von Namen bereitzustellen, und das detaillierte Verhalten kann sich über Releases hinweg ändern. Beispielsweise sind Metaklassenattribute nicht in der Ergebnisliste enthalten, wenn das Argument eine Klasse ist.

Eine Funktion wie die folgende ist in der Regel vollständiger, es gibt jedoch keine Garantie auf Vollständigkeit, da die von dir() zurückgegebene Liste von vielen Faktoren beeinflusst werden kann, darunter die Implementierung der __dir__() -Methode oder das Anpassen von __getattr__() oder __getattribute__() für die Klasse oder eines ihrer Eltern. Weitere Informationen finden Sie unter den angegebenen Links.

def dirmore(instance):
    visible = dir(instance)
    visible += [a for a in set(dir(type)).difference(visible)
                if hasattr(instance, a)]
    return sorted(visible)
10
Michael Ekoka

Bitte sehen Sie sich das Python-Shell-Skript an, das nacheinander ausgeführt wird. Hier erhalten Sie die Attribute einer Klasse im String-Format, die durch ein Komma getrennt sind.

>>> class new_class():
...     def __init__(self, number):
...         self.multi = int(number)*2
...         self.str = str(number)
... 
>>> a = new_class(4)
>>> ",".join(a.__dict__.keys())
'str,multi'<br/>

Ich benutze Python 3.4

8
Lokesh kumar

Wofür willst du das? Es kann schwierig sein, die beste Antwort zu erhalten, ohne Ihre genaue Absicht zu kennen.

  • Es ist fast immer besser, dies manuell durchzuführen, wenn Sie eine Instanz Ihrer Klasse auf bestimmte Weise anzeigen möchten. Dies beinhaltet genau das, was Sie wollen und nicht das, was Sie nicht möchten, und die Reihenfolge ist vorhersehbar. 

    Wenn Sie nach einer Möglichkeit suchen, den Inhalt einer Klasse anzuzeigen, müssen Sie die gewünschten Attribute manuell formatieren und diese als __str__- oder __repr__-Methode für Ihre Klasse angeben.

  • Wenn Sie wissen möchten, welche Methoden vorhanden sind, um ein Objekt zu verstehen, wie es funktioniert, verwenden Sie help. help(a) zeigt Ihnen eine formatierte Ausgabe über die Klasse des Objekts basierend auf seinen Dokumentstrings.

  • dir existiert für das programmgesteuerte Abrufen aller Attribute eines Objekts. (Der Zugriff auf __dict__ bewirkt etwas, das ich als das gleiche gruppieren würde, das ich aber selbst nicht verwenden würde.) Dies kann jedoch nicht die gewünschten Dinge enthalten und möglicherweise auch die, die Sie nicht möchten. Es ist unzuverlässig und die Leute glauben, dass sie es viel öfter wollen als sie.

  • Etwas orthogonal ist, dass Python 3 derzeit kaum unterstützt wird. Wenn Sie sich für das Schreiben von echter Software interessieren, werden Sie wahrscheinlich Zeug von Drittanbietern wie numpy, lxml, Twisted, PIL oder eine beliebige Anzahl von Web-Frameworks benötigen, die Python 3 noch nicht unterstützen und zu früh keine Pläne haben. Die Unterschiede zwischen 2.6 und dem 3.x-Zweig sind gering, der Unterschied bei der Bibliotheksunterstützung ist jedoch enorm.

8
Mike Graham

Alle vorherigen Antworten sind richtig, Sie haben drei Optionen für das, was Sie fragen 

1. dir ()

2. vars ()

3. _DICT_

>>> dir(a)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'multi', 'str']
>>> vars(a)
{'multi': 4, 'str': '2'}
>>> a.__dict__
{'multi': 4, 'str': '2'}
7
grepit

Es gibt mehrere Möglichkeiten, dies zu tun:

#! /usr/bin/env python3
#
# This demonstrates how to pick the attiributes of an object

class C(object) :

  def __init__ (self, name="q" ):
    self.q = name
    self.m = "y?"

c = C()

print ( dir(c) )

Wenn dieser Code ausgeführt wird, erzeugt er Folgendes:

[email protected]:~/skyset$ python3 attributes.py 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',      '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'q']

[email protected]:~/skyset$
7
user1928764

Sie können dir(your_object) verwenden, um die Attribute abzurufen, und getattr(your_object, your_object_attr), um die Werte abzurufen

verwendungszweck :

for att in dir(your_object):
    print (att, getattr(your_object,att))

Dies ist besonders nützlich, wenn Ihr Objekt kein __dict__ hat. Ist dies nicht der Fall, können Sie auch var (your_object) ausprobieren

4
Jason Angel

Attribute eines Objekts abrufen

class new_class():
    def __init__(self, number):
    self.multi = int(number) * 2
    self.str = str(number)

new_object = new_class(2)                
print(dir(new_object))                   #total list attributes of new_object
attr_value = new_object.__dict__         
print(attr_value)                        #Dictionary of attribute and value for new_class                   

for attr in attr_value:                  #attributes on  new_class
    print(attr)

Ausgabe

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__','__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'multi', 'str']

{'multi': 4, 'str': '2'}

multi
str
0
Blessed
attributes_list = [attribute for attribute in dir(obj) if attribute[0].islower()]
0
shammerw0w

Wie bereits vor der Verwendung von obj.__dict__ beschrieben, kann mit gängigen Fällen gearbeitet werden. Einige Klassen verfügen jedoch nicht über das __dict__-Attribut und verwenden __slots__ (meistens für die Speichereffizienz).

beispiel für eine widerstandsfähigere Methode:

class A(object):
    __slots__ = ('x', 'y', )
    def __init__(self, x, y):
        self.x = x
        self.y = y


class B(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y


def get_object_attrs(obj):
    try:
        return obj.__dict__
    except AttributeError:
        return {attr: getattr(obj, attr) for attr in obj.__slots__}


a = A(1,2)
b = B(1,2)
assert not hasattr(a, '__dict__')

print(get_object_attrs(a))
print(get_object_attrs(b))

die Ausgabe dieses Codes:

{'x': 1, 'y': 2}
{'x': 1, 'y': 2}

Anmerkung 1:
Python ist eine dynamische Sprache und es ist immer besser zu wissen, von welchen Klassen Sie versuchen, die Attribute abzurufen, da selbst dieser Code einige Fälle übersehen kann.

Anmerkung 2:
Dieser Code gibt nur Instanzvariablen aus, die keine Klassenvariablen enthalten. zum Beispiel:

class A(object):
    url = 'http://stackoverflow.com'
    def __init__(self, path):
        self.path = path

print(A('/questions').__dict__)

code-Ausgänge:

{'path': '/questions'}

Dieser Code gibt das Klassenattribut url nicht aus und kann die gewünschten Klassenattribute möglicherweise weglassen.
Manchmal denken wir, dass ein Attribut ein Instanzmitglied ist, aber dieses Beispiel wird und wird nicht angezeigt.

0
ShmulikA

In der folgenden Python Shell-Skriptausführung finden Sie nacheinander die folgenden Anweisungen. Sie erhalten die Lösung von der Klassenerstellung bis zum Extrahieren der Feldnamen von Instanzen.

>>> class Details:
...       def __init__(self,name,age):
...           self.name=name
...           self.age =age
...       def show_details(self):
...           if self.name:
...              print "Name : ",self.name
...           else:
...              print "Name : ","_"
...           if self.age:
...              if self.age>0:
...                 print "Age  : ",self.age
...              else:
...                 print "Age can't be -ve"
...           else:
...              print "Age  : ","_"
... 
>>> my_details = Details("Rishikesh",24)
>>> 
>>> print my_details
<__main__.Details instance at 0x10e2e77e8>
>>> 
>>> print my_details.name
Rishikesh
>>> print my_details.age
24
>>> 
>>> my_details.show_details()
Name :  Rishikesh
Age  :  24
>>> 
>>> person1 = Details("",34)
>>> person1.name
''
>>> person1.age
34
>>> person1.show_details
<bound method Details.show_details of <__main__.Details instance at 0x10e2e7758>>
>>> 
>>> person1.show_details()
Name :  _
Age  :  34
>>>
>>> person2 = Details("Rob Pike",0)
>>> person2.name
'Rob Pike'
>>> 
>>> person2.age
0
>>> 
>>> person2.show_details()
Name :  Rob Pike
Age  :  _
>>> 
>>> person3 = Details("Rob Pike",-45)
>>> 
>>> person3.name
'Rob Pike'
>>> 
>>> person3.age
-45
>>> 
>>> person3.show_details()
Name :  Rob Pike
Age can't be -ve
>>>
>>> person3.__dict__
{'age': -45, 'name': 'Rob Pike'}
>>>
>>> person3.__dict__.keys()
['age', 'name']
>>>
>>> person3.__dict__.values()
[-45, 'Rob Pike']
>>>
0
hygull