Heim  >  Artikel  >  Backend-Entwicklung  >  Erweitertes Python-Objektattribut __attr__

Erweitertes Python-Objektattribut __attr__

巴扎黑
巴扎黑Original
2016-12-08 09:29:531394Durchsuche

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}

Die erste Zeile ist das Attribut der Vogelklasse, z. B. Feder.

Die zweite Zeile enthält die Attribute der Chicken-Klasse, z. B. die Methoden „fly“ und „__init__“.

Die dritte Zeile ist das Attribut des Sommerobjekts, nämlich das Alter.

Einige Attribute, wie zum Beispiel __doc__, werden nicht von uns definiert, sondern automatisch von Python generiert. Darüber hinaus verfügt die Vogelklasse auch über eine übergeordnete Klasse, die Objektklasse (genau wie unsere Vogeldefinition, die Klasse Vogel (Objekt)). Diese Objektklasse ist die übergeordnete Klasse aller Klassen in Python.

Das heißt, die Attribute der Unterklasse überschreiben die Attribute der übergeordneten Klasse.

Sie können die Eigenschaften einer Klasse mit den folgenden 2 Methoden ändern:

summer.__dict__['age'] = 3
print(summer.__dict__['age'])
summer.age = 5
print(summer.age)
Eigenschaft in Python

Es 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 &#39;<--init&#39;
    def getNeg(self):
print &#39;<--getNeg&#39;
return self.value * -1
    def setNeg(self, value):
print &#39;<--setNeg&#39;
self.value = (-1) * value
    def delNeg(self):
print("value also deleted")
del self.value
    neg = property(getNeg, setNeg, delNeg, "I&#39;m negative")
x = num(1.1)
print(x.neg)
x.neg = -22
print(x.value)
print(num.neg.__doc__)
del x.neg
Wä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 == &#39;adult&#39;:
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.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn