Leeres Objekt mit Eigenschaften

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich benötige ein leeres Objekt mit ein paar Attributen. Hab mal gelesen, dass man dafür leere Dummy-Klassen benutzen kann:

Code: Alles auswählen

class foo:
	pass
bar = foo()
bar.a = "a"
bar.b = "b"
Geht das nicht auch einfacher ohne Klasse? Ich suche sowas wie:

Code: Alles auswählen

bar = object()
bar.a = "a"
bar.b = "b"
Es gibt ja eine object-Klasse, aber der darf ich keine beliebigen Eigenschaften geben. Fehler:
AttributeError: 'object' object has no attribute 'a'
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Korrekt. Eine eigene Klasse ist da das Mittel der Wahl.

Vorteil: du kannst gleich einen passenden Klassennamen vergeben.

Außerdem verwende ich gerne etwas in diesem Sinne:

Code: Alles auswählen

class namespace(object):
    def __init__(self, **kwds):
        self.__dict__.update(kwds)
Benutzung:

Code: Alles auswählen

bar = namespace(a=1, b=2, c=3)
bar.d = 5
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Was ist denn die Superclass von object? Das muss doch auch eine übergeordnete gaaaanz simple Klasse haben.

Mit dem Erben von object hab ich so meine Probleme... wenn man dort eine __init__ definiert, wird doch die originale von object überschrieben, richtig?

EDIT: Ach, jetzt hab ich dein Code-Snippet grad kapiert... sehr geil! :twisted: Nach sowas hatte ich letztens fast gesucht, hab's dann aber doch nicht benötigt.

Ich brauch sowas eigentlich nur, um ein paar Konstanten zu definieren. So richtige Konstanten gibt's in Python aber gar nicht, oder?
Zuletzt geändert von droptix am Freitag 15. Dezember 2006, 20:52, insgesamt 1-mal geändert.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

droptix hat geschrieben:Was ist denn die Superclass von object? Das muss doch auch eine übergeordnete gaaaanz simple Klasse haben.
Hä? Simpler als "object"? Das _ist_ die absolute Superclass. (von old-style Klassen abgesehen)
Mit dem Erben von object hab ich so meine Probleme... wenn man dort eine __init__ definiert, wird doch die originale von object überschrieben, richtig?
Ja. Die tut aber nix, also muss ich sie im neuen __init__ nicht aufrufen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Warum kann man einer Instanz von object dann keine Eigenschaften zuweisen? Aber wenn ich eine eigene Klasse definiere (die muss ja intern dann irgendwie von object abgeleitet werden, ohne dass man das "merkt"), dann geht's --> Wieso?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Weil object kein __dict__ hat (entspricht quasi __slots__ = [] in einer Python-Klasse), wie die meisten builtin-Typen. Subklassen haben eines, da diese Eigenschaft nicht vererbt wird.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@droptix
Ums mal salopp zu sagen: Weil man `object` nicht ändern kann ;) `object` ist dazu da damit man von ihm erbt und danach eine New-Style Klasse hat :) Mehr nicht.
BlackJack

droptix hat geschrieben:Ich brauch sowas eigentlich nur, um ein paar Konstanten zu definieren. So richtige Konstanten gibt's in Python aber gar nicht, oder?
Konstanten werden in Python per Konvention mit Namen versehen die komplett in Grossbuchstaben geschrieben. Ähnlich wie in C.
Antworten