Heim > Artikel > Backend-Entwicklung > Erweitertes Python-Objektattribut __attr__
Alles in Python ist ein Objekt und jedes Objekt kann mehrere Attribute haben. Die Attribute von Python verfügen über ein einheitliches Verwaltungsschema.
Die Attribute eines Objekts können aus seiner Klassendefinition stammen, die als Klassenattribut bezeichnet wird.
Klassenattribute können aus der Klassendefinition selbst stammen oder von der Klassendefinition geerbt werden.
Die Attribute eines Objekts können auch durch die Objektinstanz definiert werden, die als Objektattribute bezeichnet werden.
Die Eigenschaften eines Objekts werden im __dict__-Attribut des Objekts gespeichert.
__dict__ ist ein Wörterbuch, der Schlüssel ist der Attributname und der entsprechende Wert ist das Attribut selbst. Schauen wir uns die folgenden Klassen und Objekte an.
entspricht der Reflexion von Java, um die Attribute des Objekts zu erhalten, wie zum Beispiel:
public class UserBean { private Integer id; private int age; private String name; private String address; } //类实例化 UserBean bean = new UserBean(); bean.setId(100); bean.setAddress("武汉"); //得到类对象 Class userCla = (Class) bean.getClass(); //得到类中的所有属性集合 Field[] fs = userCla.getDeclaredFields(); ......
class bird(object): feather = True class chicken(bird): fly = False def __init__(self, age): self.age = age summer = chicken(2) print(bird.__dict__) print(chicken.__dict__) print(summer.__dict__)
Ausgabe:
{'__dict__': 97977f598415edac67307529971de8f5, '__module__': '__main__', '__weakref__': 76d1cb7bced95164995babcd29545014, 'feather': True, '__doc__': Keine🎜>
{'fly': False, '__module__': '__main__', '__doc__': None, '__init__': c51d1476b57e7fe91e8dedc84c3b2a0c}
{'age': 2}
summer.__dict__['age'] = 3 print(summer.__dict__['age']) summer.age = 5 print(summer.age)Eigenschaft in PythonEs können Abhängigkeiten zwischen verschiedenen Eigenschaften desselben Objekts bestehen. Wenn eine Eigenschaft geändert wird, möchten wir, dass sich gleichzeitig auch andere Eigenschaften ändern, die von dieser Eigenschaft abhängen. Derzeit können wir Attribute nicht statisch über __dict__ speichern. Python bietet mehrere Möglichkeiten, Eigenschaften im laufenden Betrieb zu generieren. Eine davon wird als Eigentum bezeichnet.
class bird(object): feather = True #extends bird class class chicken(bird): fly = False def __init__(self, age): self.age = age def getAdult(self): if self.age > 1.0: return True else: return False adult = property(getAdult) # property is built-in summer = chicken(2) print(summer.adult) summer.age = 0.5 print(summer.adult)Die Funktion ähnelt hier einem Trigger. Jedes Mal, wenn das Erwachsenenattribut abgerufen wird, wird der Wert von getAdult ausgelöst. Eigenschaften werden mit der integrierten Funktion property() erstellt. property() kann bis zu vier Parameter laden. Die ersten drei Parameter sind Funktionen, mit denen Abfragemerkmale verarbeitet, Merkmale geändert und Merkmale gelöscht werden. Der letzte Parameter ist das Dokument der Funktion, bei dem es sich um eine Zeichenfolge zur Beschreibung handeln kann.
class num(object): def __init__(self, value): self.value = value print '<--init' def getNeg(self): print '<--getNeg' return self.value * -1 def setNeg(self, value): print '<--setNeg' self.value = (-1) * value def delNeg(self): print("value also deleted") del self.value neg = property(getNeg, setNeg, delNeg, "I'm negative") x = num(1.1) print(x.neg) x.neg = -22 print(x.value) print(num.neg.__doc__) del x.negWährend des gesamten Prozesses wurden die entsprechenden Funktionen nicht aufgerufen. Mit anderen Worten, das Erstellen, Festlegen und Löschen des Neg-Attributs wird alle über property() registriert. Python-Spezialmethode __getattr__ (wird häufig verwendet)Wir können __getattr__(self, name) verwenden, um die generierten Attribute sofort abzufragen. In Python sind Objektattribute dynamisch und Attribute können jederzeit nach Bedarf hinzugefügt oder gelöscht werden. Dann besteht die Funktion von getattr darin, beim Generieren dieser Attribute eine Ebene der Beurteilungsverarbeitung durchzuführen. Zum Beispiel:
class bird(object): feather = True class chicken(bird): fly = False def __init__(self, age): self.age = age def __getattr__(self, name): if name == 'adult': if self.age > 1.0: return True else: return False else: raise AttributeError(name) summer = chicken(2) print(summer.adult) summer.age = 0.5 print(summer.adult) print(summer.male)Jede Funktion benötigt ihre eigene Verarbeitungsfunktion, und __getattr__ kann alle sofort generierten Attribute in derselben Funktion verarbeiten. __getattr__ kann basierend auf dem Funktionsnamen verschiedene Attribute verarbeiten. Wenn wir beispielsweise oben den Attributnamen „männlich“ abfragen, lösen wir AttributeError aus. (In Python gibt es auch eine spezielle Methode __getattribute__, mit der beliebige Attribute abgefragt werden können. __getattr__ kann nur zum Abfragen von Attributen verwendet werden, die nicht im __dict__-System enthalten sind.)
__setattr__(self, name, value) und __delattr__(self, name) können zum Ändern und Löschen von Attributen verwendet werden. Sie haben ein breiteres Anwendungsspektrum und können für jedes Attribut verwendet werden.