Attribute eines Objektes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

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.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Zuletzt geändert von snafu am Samstag 4. Juni 2011, 13:32, insgesamt 2-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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']
Das Leben ist wie ein Tennisball.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

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.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Huch, auf einmal Python 2.4? In deiner Signatur steht 3.0.1.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

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.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich meine kein anderes `dir()`. Es gibt nur eins. Ich hatte dich wohl falsch verstanden.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

snafu hat geschrieben:Ich meine kein anderes `dir()`. Es gibt nur eins. Ich hatte dich wohl falsch verstanden.
goodie
[url=http://www.proandkon.com]proandkon.com[/url]
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'}
>>> 
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

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.
[url=http://www.proandkon.com]proandkon.com[/url]
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.
Antworten