Heim >Backend-Entwicklung >Python-Tutorial >Zugriffsregeln für Python-Klasseninstanzattribute
Im Allgemeinen sind in Python die Zugriffsregeln für Klasseninstanzattribute relativ intuitiv.
Es gibt jedoch immer noch einige Dinge, die insbesondere für C- und Java-Programmierer nicht sehr intuitiv sind.
Hier müssen wir die folgenden Punkte verstehen:
1. Python ist eine dynamische Sprache und jede Entität kann Attribute dynamisch hinzufügen oder löschen.
2. Eine Klasse definiert einen Bereich.
3. Klasseninstanzen führen auch einen Bereich ein, der sich von dem durch die entsprechende Klasse definierten Bereich unterscheidet.
4. Wenn Sie nach Attributen in einer Klasseninstanz suchen, suchen Sie zunächst im Bereich der Instanz selbst. Wenn nicht, suchen Sie dann im Bereich der Klassendefinition.
5. Wenn Sie einem Klasseninstanzattribut einen Wert zuweisen, wird ein Attribut tatsächlich dem durch die Klasseninstanz definierten Bereich hinzugefügt (sofern es noch nicht vorhanden ist) und hat keine Auswirkungen auf die in definierten Attribute die entsprechende Klasse mit demselben Namen.
Schauen wir uns ein Beispiel an, um unser Verständnis der oben genannten Punkte zu vertiefen:
Klasse A:
cls_i = 0
cls_j = {}
def __init__(self):
self.instance_i = 0
self.instance_j = {}
Hier definieren wir zunächst eine Instanz a der Klasse A , und schauen Sie sich dann an, was im Umfang der Klasse A und im Umfang der Instanz a liegt:
>>> a = A()
>>> a.__dict__
{'instance_j': {}, 'instance_i': 0}
>>> A.__dict__
{'__init__': , '__module__': '__main__', ' cls_i ': 0, 'cls_j': {}, '__doc__': None}
Wir sehen, dass es im Geltungsbereich von a „instance_i“ und „instance_j“ sowie im Geltungsbereich von A „cls_i“ und „cls_j“ gibt.
Sehen wir uns an, wie die Namenssuche abläuft:
>>> a.cls_i
0
>>> a.instance_i
>> >0
Bei der Suche nach cls_i liegt es nicht im Bereich von Instanz a, aber bei der Suche nach instanz_i kann es direkt gefunden werden der Geltungsbereich eines Finden Sie es im Geltungsbereich.
Was passiert, wenn wir versuchen, den Wert von cls_i durch Instanz a zu ändern:
>>> a.cls_i = 1
>>> a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
>>> A.__dict__
{'__init__': , ' __module__' : '__main__', 'cls_i': 0, 'cls_j': {}, '__doc__': None}
Wir können sehen, dass es im Gültigkeitsbereich von a ein zusätzliches cls_i-Attribut gibt und sein Wert ist 1; Gleichzeitig haben wir auch festgestellt, dass der Wert des cls_i-Attributs im A-Bereich hier immer noch 0 ist. Wir haben tatsächlich ein Instanzattribut hinzugefügt und das Klassenattribut nicht geändert.
Was passiert, wenn wir die Daten in cls_j über Instanz a manipulieren (beachten Sie, dass nicht cls_j selbst):
>>> a.cls_j['a'] = 'a'
>>> a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
>>> A.__dict__
{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {'a': 'a'}, '__doc__': None}
Wir können Beachten Sie, dass sich der Umfang von a nicht geändert hat, der Umfang von A jedoch einige Änderungen erfahren hat und die Daten in cls_j sich geändert haben.
Änderungen im Bereich einer Instanz wirken sich nicht auf andere Instanzen der Klasse aus, aber Änderungen im Bereich einer Klasse wirken sich auf alle Instanzen der Klasse aus, einschließlich der zuvor erstellten Instanzen:
> >> A.cls_k = 0
>>> i.cls_k
0