2009-10-07 15 views
33

In Javascript wäre es:Wie erstellt man Inline-Objekte mit Eigenschaften in Python?

var newObject = { 'propertyName' : 'propertyValue' }; 

Wie es in Python zu tun?

+0

die gleiche Syntax in Python ein Wörterbuch schaffen würde, und das ist nicht das, was ich will –

+6

Könnten Sie erklären, warum ** ** Sie, was wollen Sie fragen zum? Es könnte helfen, dass Leute Sie zu besseren, mehr pythischen Alternativen führen. –

+0

@coli Ich habe eine Methode, die ein Objekt mit einigen Eigenschaften zurückgibt. Falls die Methode fehlschlägt, möchte ich dieses Objekt manuell erstellen. –

Antwort

64
obj = type('obj', (object,), {'propertyName' : 'propertyValue'}) 

gibt es two kinds of type function uses.

+1

+1 für die beste Antwort bei weitem. –

+0

+1 - Sehr interessant! Ich kannte diese Art der Funktion nicht - könnten Sie mich bitte mit einer Dokumentation darüber verlinken? – Smashery

+1

http://docs.python.org/library/functions.html#Type –

10

Ich weiß nicht, ob es eine eingebaute Möglichkeit, es zu tun, aber man kann immer eine Klasse wie folgt definieren:

class InlineClass(object): 
    def __init__(self, dict): 
     self.__dict__ = dict 

obj = InlineClass({'propertyName' : 'propertyValue'}) 
4

Ich mag Smashery's Idee, aber Python scheint zufrieden damit Sie ändern Klassen auf eigene Faust:

>>> class Inline(object): 
...  pass 
... 
>>> obj = Inline() 
>>> obj.test = 1 
>>> obj.test 
1 
>>> 

Funktioniert ganz gut in Python 2.5 für mich. Beachten Sie, dass Sie dies für eine von object abgeleitete Klasse tun müssen - es wird nicht funktionieren, wenn Sie die Zeile zu obj = object ändern.

+2

Ja, Sie können das tun - aber aus irgendeinem seltsamen Grund, können Sie einfach nicht verwenden object() - Sie müssen Ihre eigene Klasse erstellen. – Smashery

+5

Wenn Sie eine Inline-Klasse wollen, können Sie 'obj = lambda: None' verwenden, was bizarr ist, aber die notwendigen Aufgaben erledigen wird ... – Peter

+0

@Peter - das wusste ich nicht. Aber jetzt, wo ich es sehe, mag ich SilentGhosts Antwort viel besser. –

19

Peter Antwort

obj = lambda: None 
obj.propertyName = 'propertyValue' 
+1

Erstaunlich, wie geht das? –

+0

@ManelClos er erstellt ein Funktionsobjekt, das keine zurückgibt, die Sie mit obj() sehen könnten. Das Funktionsobjekt kann Eigenschaften haben. – jeremyjjbrown

0
class test: 
    def __setattr__(self,key,value): 
     return value 


myObj = test() 
myObj.mykey = 'abc' # set your property and value 
+0

Es ist nicht notwendig, __setattr__ zu definieren, siehe Chris Antwort –

2

Es ist in Python einfach eine Klasse mit einer __init__() Funktion zu erklären, dass die Instanz für Sie, mit optionalen Argumenten einrichten. Wenn Sie die Argumente nicht angeben, erhalten Sie eine leere Instanz, und wenn Sie einige oder alle Argumente angeben, initialisieren Sie die Instanz.

Ich erklärte es here (meine am höchsten bewertete Antwort bis heute), so werde ich die Erklärung nicht erneut eingeben. Aber wenn Sie Fragen haben, fragen Sie und ich werde antworten.

Wenn Sie nur ein generisches Objekt, dessen Klasse will nicht wirklich wichtig sind, können Sie dies tun:

class Generic(object): 
    pass 

x = Generic() 
x.foo = 1 
x.bar = 2 
x.baz = 3 

Eine offensichtliche Erweiterung eine __str__() Funktion hinzuzufügen wäre, die etwas Nützliches druckt.

Dieser Trick ist manchmal nett, wenn Sie ein bequemeres Wörterbuch wünschen. Ich finde es einfacher, x.foo als x["foo"] einzugeben.

9

Python 3,3 hinzugefügt, um die SimpleNamespace Klasse für den exakt Zweck:

>>> from types import SimpleNamespace 

>>> obj = SimpleNamespace(propertyName='propertyValue') 
>>> obj 
namespace(propertyName='propertyValue') 

>>> obj.propertyName 
'propertyValue' 

Zusätzlich zu dem geeigneten Konstruktor das Objekt zu bauen, SimpleNamespace definiert __repr__ und __eq__ (documented in 3.4) wie erwartet zu verhalten.

+1

Wow, danke! Ich wusste, dass es in Python so etwas geben musste, und es dauerte ungefähr 10 Links, um das zu finden. Vielen Dank! – dusktreader

0

Eine weitere sinnvolle Option ist die Verwendung namedtuple:

from collections import namedtuple 

message = namedtuple('Message', ['propertyName'], verbose=True) 
messages = [ 
    message('propertyValueOne'), 
    message('propertyValueTwo') 
] 
Verwandte Themen