Seite 1 von 1

Leeres Objekt mit Eigenschaften

Verfasst: Freitag 15. Dezember 2006, 20:43
von droptix
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'

Verfasst: Freitag 15. Dezember 2006, 20:47
von birkenfeld
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

Superclass von object

Verfasst: Freitag 15. Dezember 2006, 20:49
von droptix
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?

Re: Superclass von object

Verfasst: Freitag 15. Dezember 2006, 20:51
von birkenfeld
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.

Verfasst: Freitag 15. Dezember 2006, 20:54
von droptix
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?

Verfasst: Freitag 15. Dezember 2006, 20:56
von birkenfeld
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.

Verfasst: Freitag 15. Dezember 2006, 20:58
von sape
@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.

Re: Superclass von object

Verfasst: Freitag 15. Dezember 2006, 21:18
von 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.