5 Stimmen

was macht benutzerdefinierte Objekte nicht werfen AttributeError in Python?

Mögliches Duplikat:
Warum kann ich nicht direkt Attribute zu einem Python-Objekt hinzufügen?
Warum kann man in Python keine Attribute zu einem Objekt hinzufügen?

Der folgende Code löst keinen AttributeError aus

class MyClass():
    def __init__(self):
        self.a = 'A'
        self.b = 'B'
my_obj = MyClass()
my_obj.c = 'C'

Dies steht im Gegensatz zu

>>> {}.a = 'A'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'a'

Was macht diesen Unterschied aus? Geht es darum, dass dict eine eingebaute Klasse ist, während MyClass benutzerdefiniert ist?

2voto

Sven Marnach Punkte 525472

Der Unterschied besteht darin, dass Instanzen von benutzerdefinierten Klassen standardmäßig mit einem Wörterbuch von Attributen versehen sind. Sie können auf dieses Wörterbuch mit vars(my_obj) o my_obj.__dict__ . Sie können die Erstellung eines Attributwörterbuchs verhindern, indem Sie __slots__ :

class MyClass(object):
    __slots__ = []

Eingebaute Typen könnten auch ein Attributwörterbuch bereitstellen, tun dies aber normalerweise nicht. Ein Beispiel für einen eingebauten Typ, der hace support attributes ist der Typ einer Funktion.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X