In Javascript wäre es:Wie erstellt man Inline-Objekte mit Eigenschaften in Python?
var newObject = { 'propertyName' : 'propertyValue' };
Wie es in Python zu tun?
In Javascript wäre es:Wie erstellt man Inline-Objekte mit Eigenschaften in Python?
var newObject = { 'propertyName' : 'propertyValue' };
Wie es in Python zu tun?
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
gibt es two kinds of type
function uses.
+1 für die beste Antwort bei weitem. –
+1 - Sehr interessant! Ich kannte diese Art der Funktion nicht - könnten Sie mich bitte mit einer Dokumentation darüber verlinken? – Smashery
http://docs.python.org/library/functions.html#Type –
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'})
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.
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
Wenn Sie eine Inline-Klasse wollen, können Sie 'obj = lambda: None' verwenden, was bizarr ist, aber die notwendigen Aufgaben erledigen wird ... – Peter
@Peter - das wusste ich nicht. Aber jetzt, wo ich es sehe, mag ich SilentGhosts Antwort viel besser. –
Peter Antwort
obj = lambda: None
obj.propertyName = 'propertyValue'
Erstaunlich, wie geht das? –
@ManelClos er erstellt ein Funktionsobjekt, das keine zurückgibt, die Sie mit obj() sehen könnten. Das Funktionsobjekt kann Eigenschaften haben. – jeremyjjbrown
class test:
def __setattr__(self,key,value):
return value
myObj = test()
myObj.mykey = 'abc' # set your property and value
Es ist nicht notwendig, __setattr__ zu definieren, siehe Chris Antwort –
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.
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.
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
Eine weitere sinnvolle Option ist die Verwendung namedtuple:
from collections import namedtuple
message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
message('propertyValueOne'),
message('propertyValueTwo')
]
die gleiche Syntax in Python ein Wörterbuch schaffen würde, und das ist nicht das, was ich will –
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. –
@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. –