web-dev-qa-db-ger.com

Ein leeres Objekt in Python erstellen

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.

55
Smiles

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'
>>> 
68
aychedee

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'
37
Vlad Bezden

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!'
34
Will

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
11
lejlot

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)
0
D z

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'

Siehe die Dokumentation von unittest.mock hier.

0
qben