Seite 1 von 1

Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 13:00
von mzh
Hallo zusammen
Wenn ich in der Pythonshell eine Klasse importiere kann ich mit

Code: Alles auswählen

for i in dir(ImportedClass):
    print i
sehen, was die Klasse für eine API anbietet.
Ist es auch möglich, die Attribute anzuzeigen? Also alle Objektvariablen die mit 'self' gekennzeichnet werden?
Bspw.

Code: Alles auswählen

class ImportedClass:
    def __init__(self, attA='foo', attB='bar'):
        self.attA = attA
        self.attB = attB
Ich möchte also in der Pythonshell irgendwie sehen können, dass die ImportedClass die Attribute 'attA' und 'attB' hat.
Danke für Hinweise.

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 13:29
von snafu
Direkt mit `dir()` nicht, denn Methoden sind ja prinzipiell auch nur Attribute im Sinne von Objekten. In dem Fall halt aufrufbare. Es gibt aber im Modul `inspect` die Funktionen `isfunction()` bzw `ismethod()`. Damit könntest du dann sozusagen nach dem Auschlussprinzip filtern (`if not`).

Im Regelfall mache ich es aber so, dass ich einfach einen Attributzugriff mache und dann sehe ich ja, was in der Python-Shell zurückgegeben wird. Und das natürlich auch nur, wenn keine Doku vorhanden ist. ;)

Edit 1: Zweiten Absatz geschrieben
Edit 2: Namen der `inspect`-Funktionen korrigiert

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 13:30
von EyDu

Code: Alles auswählen

>>> class Spam(object):
...     def __init__(self):
...         self.foo = 42
...         self.bar = 23
... 
>>> s = Spam()
>>> dir(s)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo']

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 13:54
von mzh
EyDu hat geschrieben:

Code: Alles auswählen

>>> class Spam(object):
...     def __init__(self):
...         self.foo = 42
...         self.bar = 23
... 
>>> s = Spam()
>>> dir(s)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo']

Code: Alles auswählen

user @ ~ $ python
Python 2.4.3 (#1, Sep  3 2009, 15:37:37) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Spam:
...     def __init__(self):
...         self.foo=42
...         self.bar=23
... 
>>> s=Spam()
>>> dir(s)
['__doc__', '__init__', '__module__', 'bar', 'foo']
>>> 
Ok.

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 14:03
von jbs
Huch, auf einmal Python 2.4? In deiner Signatur steht 3.0.1.

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 14:19
von mzh
jbs hat geschrieben:Huch, auf einmal Python 2.4? In deiner Signatur steht 3.0.1.
2.4.3 ist besser.

Nein, ist einfach auf dem Unicomputer vorinstalliert.
@snafu: meinst du ein anderes 'dir()'? Weil so wie das für mich aussieht geht es ja schon. Eben, die Idee ist ja gerade, dass man aus irgendeinem Grund die Attribute nicht kennt, und sehen will welche vorhanden sind.

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 14:31
von snafu
Ich meine kein anderes `dir()`. Es gibt nur eins. Ich hatte dich wohl falsch verstanden.

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 14:37
von mzh
snafu hat geschrieben:Ich meine kein anderes `dir()`. Es gibt nur eins. Ich hatte dich wohl falsch verstanden.
goodie

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 18:28
von deets
Ich lasse mir zB im Python-Debugger gerne ein pprint des Instanz-Dicts ausgeben - das sind dann eben nur die Attribute der Instanz, nicht der Klasse.

Code: Alles auswählen

>>> import pprint
>>> class Foo(object):
...    def __init__(self):
...       self.a = 100
...       self.b = "bar"
... 
>>> f = Foo()
>>> pprint.pprint(f.__dict__)
{'a': 100, 'b': 'bar'}
>>> 

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 18:45
von mzh
deets hat geschrieben:

Code: Alles auswählen

>>> import pprint
>>> class Foo(object):
...    def __init__(self):
...       self.a = 100
...       self.b = "bar"
... 
>>> f = Foo()
>>> pprint.pprint(f.__dict__)
{'a': 100, 'b': 'bar'}
>>> 
scheint ähnlich wie 'dir()' zu sein.. gut zu wissen.

Re: Attribute eines Objektes

Verfasst: Samstag 4. Juni 2011, 19:13
von deets
@mzh

Jein. Natuerlich gibt's Ueberschneidungen. Aber waehren dir() auch auf die Klasse guckt (und eben Methodennamen findet), holt es dir keine Werte. Das tut mein Ansatz - es ist "nur" der Objektzustand.