2014-03-19 22 views
5

Gibt es eine spezielle Klasse in Python, um leere Objekte zu erstellen? Ich habe versucht object(), aber ich konnte Felder nicht hinzufügen. Ich möchte es so verwenden:Gibt es eine leere Klasse in Python?

obj = EmptyObject() 
obj.foo = 'far' 
obj.bar = 'boo' 

Soll ich jedes Mal (in mehreren unabhängigen Scripts) wie diese neue Klasse definieren?

class EmptyObject: 
    pass 

Ich benutze python2.7

+2

Es ist zwei Zeilen ziemlich selbstverständlich Code, ich nicht sehen Problem mit der Wiederholung. Selbst wenn Sie einen neuen 'Import' hinzufügen müssten, um ein existierendes' EmptyObject' zu erhalten, wären die Nettoeinsparungen gering. – user4815162342

+0

Sie könnten es sogar auf eine Zeile setzen, nein? – 2rs2ts

+1

Haben Sie [namedtuple] (http://docs.python.org/2/library/collections.html#collections.namedtuple) berücksichtigt? Ich habe das Gefühl, dass du ein Rad neu erfindest. – kojiro

Antwort

7

Wenn Sie ein Platzhalter-Objekt suchen, zu dem Sie beliebige statische Elemente hinzufügen können, dann ist die nächste, die ich habe ist eine leere Lambda-Funktion.

obj = lambda: None # Dummy function 
obj.foo = 'far' 
obj.bar = 'boo' 

print obj.foo, obj.bar 
# far boo 

Denken Sie daran:obj ist nicht ein Objekt einer Klasse, Objekt bedeutet nicht Klasseninstanz, weil in Python-Klassen und Funktionen Objekte zur Laufzeit sind wie Klasseninstanzen

+1

Warum das Argument? Sie könnten genauso gut 'Lambda: 0' verwenden. Ich würde es jedoch immer noch nicht verwenden, da es schwierig ist, herauszufinden, warum Sie überhaupt das "Lambda" erstellen. –

+8

Mhh ...Obwohl das sicherlich interessant ist, würde ich das im Produktionscode natürlich nicht sehen wollen. –

+0

Mein Vorschlag für Originalität, aber ich stimme Lukas Graf zu, diese Lösung ist nicht für die Produktion – sbeliakov

2

Sie können einen neuen Typ dynamisch mit den Feldern erstellen, die er mit der type-Funktion haben soll:

x = type('empty', (object,), {'foo': 'bar'}) 
x.bar = 3 
print(x.foo) 

Dies ist jedoch nicht ganz das, was Sie wollen, da es einen benutzerdefinierten Typ hat, nicht einen leeren Typ.

+0

Auch wird es einen neuen Typ bei jedem Aufruf erstellen, der ziemlich teuer ist. – user4815162342

8

types.SimpleNamespace wurde mit Python 3.3 eingeführt, um genau diesen Zweck zu erfüllen. Die Dokumentation zeigt auch einen einfachen Weg, um es selbst in Python zu implementieren, so dass Sie es zu Ihrem Python 3.3-Setup hinzufügen und es verwenden können, als ob es dort wäre (beachten Sie, dass die eigentliche Implementierung in C erfolgt):

Aber natürlich, wenn Sie nicht seine wenigen Funktionen benötigen, tut ein einfaches class Empty: pass genau das gleiche.

+0

Leider benutze ich python2.7 – sbeliakov

+3

@ maggot092 Und wie gesagt, du kannst die Implementierung einfach zu deinem Python 2 Projekt hinzufügen und verwenden, als ob es dort wäre ... – poke

+0

In diesem Fall hast du es auch gesagt Ich sehe keinen Vorteil darin, die Emty-Klasse zu definieren – sbeliakov

2

Es gibt keine types.SimpleNamespace in Python 2.7, Sie collections.namedtuple() für unveränderliche Objekte stattdessen verwenden:

>>> from collections import namedtuple 
>>> FooBar = namedtuple('FooBar', 'foo bar') 
>>> FooBar('bar', 'foo') 
FooBar(foo='bar', bar='foo') 

Oder argparse.Namespace:

>>> from argparse import Namespace 
>>> o = Namespace(foo='bar') 
>>> o.bar = 'foo' 
>>> o 
Namespace(bar='foo', foo='bar') 
+0

Cool - ein weiterer Grund, argparse zu verwenden! – nealmcb

Verwandte Themen