Gibt es Verknüpfungen, um ein leeres Objekt in Python zu definieren, oder müssen Sie immer eine Instanz einer benutzerdefinierten leeren Klasse erstellen?
Bearbeiten: Ich meine ein leeres Objekt, das für das Eingeben von Enten verwendbar ist.
Mit type können Sie schnell eine neue Klasse erstellen und dann instanziieren. So wie:
>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>
Die einzugebenden Argumente sind: Klassenname, ein Tuple mit Basisklassen und das Wörterbuch des Objekts. Diese kann Funktionen (die Methoden des Objekts) oder Attribute enthalten.
Sie können die erste Zeile tatsächlich verkürzen
>>> t = type('test', (), {})()
>>> t.__class__.__bases__
(object,)
Standardmäßig erstellt type neue Stilklassen, die vom Objekt erben.
type
wird in Python für Metaprogrammierung verwendet.
Wenn Sie jedoch nur eine Instanz eines Objekts erstellen möchten. Dann erstellen Sie einfach eine Instanz davon. Wie lejlot vorschlägt.
Das Erstellen einer Instanz einer neuen Klasse wie dieser hat einen wichtigen Unterschied, der nützlich sein kann.
>>> a = object()
>>> a.whoops = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'whoops'
Wohingegen:
>>> b = type('', (), {})()
>>> b.this_works = 'cool'
>>>
Ja, in Python 3.3 wurde SimpleNamespace hinzugefügt
Im Gegensatz zum Objekt können Sie mit SimpleNamespace Attribute hinzufügen und entfernen. Wenn ein SimpleNamespace-Objekt mit Schlüsselwortargumenten initialisiert wird, werden diese dem zugrunde liegenden Namespace direkt hinzugefügt.
Beispiel:
import types
x = types.SimpleNamespace()
x.happy = True
print(x.happy) # True
del x.happy
print(x.happy) # AttributeError. object has no attribute 'happy'
Eine einfache, weniger furchterregende Möglichkeit, ein leeres (-ish) -Objekt zu erstellen, besteht darin, die Tatsache zu nutzen, dass Funktionen in Python Objekte sind, einschließlich Lambda-Funktionen:
obj = lambda: None
obj.test = "Hello, world!"
Zum Beispiel:
In [18]: x = lambda: None
In [19]: x.test = "Hello, world!"
In [20]: x.test
Out[20]: 'Hello, world!'
Was meinst du mit "leerem Objekt"? Instanz der Klasse object
? Sie können einfach laufen
a = object()
oder vielleicht meinst du Initialisierung auf die Nullreferenz? Dann kannst du verwenden
a = None
Konstruiert ein neues leeres Set-Objekt . Wenn der optionale Parameter iterable angegeben ist, wird der Satz mit Elementen aktualisiert, die aus der Iteration abgerufen wurden. Alle Elemente in iterable sollten unveränderlich sein oder mithilfe des in Abschnitt Protokoll für die automatische Konvertierung in unveränderliche Daten beschriebenen Protokolls in eine unveränderliche umgewandelt werden.
Ex:
myobj = set()
for i in range(1,10): myobj.add(i)
print(myobj)
Alle vorgeschlagenen Lösungen sind etwas umständlich.
Ich habe einen Weg gefunden, der nicht hackig ist, sondern tatsächlich dem ursprünglichen Design entspricht.
>>> from mock import Mock
>>> foo = Mock(spec=['foo'], foo='foo')
>>> foo.foo
'foo'
>>> foo.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/prezi/virtualenv/local/lib/python2.7/site-packages/mock/mock.py", line 698, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'bar'