[Road to Intermediate Python] Definieren Sie die Funktion __getattr__ in der Klasse

Link zur Zusammenfassung

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8

Einführung

Um Python zu studieren, habe ich eine Group Intelligence Library namens acopy kopiert.

In acopy werden viele interessante Python-Grammatiken und -Sprachen verwendet, und es wird zusammengefasst, dass dies unter ihnen praktisch ist.

Dieses Mal definieren wir eine spezielle Methode "getattr" in der Klasse.

Instanzattribute

Zum Abrufen von Attributen, die in einer Instanz in Python verwendet werden Es gibt eine Möglichkeit, auf "__dict __" zu verweisen.

Der Name des in der Instanz verwendeten Namespace wird in __dict__ als Wörterbuch definiert.

Nehmen Sie zum Beispiel das folgende Beispiel.

class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y


# {'x': 10, 'y': 20}
a = A(10, 20)
print(a.__dict__)

Die Instanz a hat die Namen $ x, y $ Sie können sie als Wörterbuch abrufen.

__getattr__

Sie können in einer Python-Klasse eine spezielle Methode namens "getattr" definieren.

Beim Aufrufen des Namens einer Python-Instanz Wenn es mit einem undefinierten Namen aufgerufen wird, wird ** AttributeError ** zurückgegeben.

Aber wenn __getattr__ definiert ist, Anstatt einen AttributeError "bei einem Aufruf mit einem undefinierten Namen" zurückzugeben, wird "getattr" ausgeführt.

Schauen wir uns ein Beispiel an.

class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __getattr__(self, name):
        print(name, 'getattr')
        if name == 'hello':
            return self.world
        raise AttributeError

    def world(self, x):
        return x


'''
{'x': 10, 'y': 20}
hello getattr
<bound method A.world of <__main__.A object at 0x10e602150>>
hello getattr
20
'''
a = A(10, 20)
print(a.__dict__)
print(a.hello)
print(a.hello(20))

Die Methode __getattr__ ist in der obigen Klasse A definiert.

Wenn ich versuche, "a.hello" aufzurufen, ist das Attribut "Hallo" nicht in a definiert. Daher wird die Methode getattr aufgerufen und gibt stattdessen die Methode world zurück.

In "a.hello (20)" wird zuerst die Weltmethode zurückgegeben, und die Weltmethode erhält den Wert 20 und wird ausgeführt. Daher wird es ausgeführt, wenn der Name Hallo bestätigt wird.

Wenn Sie die oben genannten Eigenschaften verwenden, wird daher der folgende nutzlose Code angewendet.

class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __getattr__(self, name):
        print(name, 'getattr')
        if name == 'hello':
            return self.world
        if name == 'world':
            return self.great
        if name == 'great':
            return self.bad
        if name == 'bad':
            return 0
        raise AttributeError


'''
{'x': 10, 'y': 20}
hello getattr
world getattr
great getattr
bad getattr
0
'''
a = A(10, 20)
print(a.__dict__)
print(a.hello)

Anwendungsbeispiel

Ich kann mir nicht viele Anwendungsbeispiele vorstellen, Wenn es kein Attribut gibt, frage ich mich, ob es eine alternative Regelverarbeitung gibt. Es scheint auch, dass der Zweig usw. abhängig vom Anrufnamen geändert werden kann.

class A:

    def __getattr__(self, name):
        self.nothing(name)

    def exist(self):
        print('exist!')

    def nothing(self, name):
        print(f'nothing {name}')


'''
exist!
nothing unnti
'''
a = A()
a.exist()
a.unnti

Darüber hinaus als jeder Inhalt als separater Artikel zu einem späteren Zeitpunkt Es scheint, dass es auch verwendet werden kann, indem ein Ausnahmecode ausgelöst wird, wenn der Lambda-Ausdruck keinen Namen enthält.

Verweise

Recommended Posts

[Road to Intermediate Python] Definieren Sie die Funktion __getattr__ in der Klasse
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf
Ein Weg zum mittleren Python
[Python] Weg zur Serpent (3) Python-Klasse
[Road to Intermediate] Grundlegendes zu Python-Eigenschaften
[Road to Intermediate Python] Installieren Sie Pakete in großen Mengen mit pip
[Road to Intermediate Python] Verwenden Sie die if-Anweisung in der Listeneinschlussnotation
[Einführung in Python] Wie verwende ich eine Klasse in Python?
[Road to Intermediate Python] Verwenden Sie ternäre Operatoren
Dynamisches Definieren von Variablen in Python
Verwendung von __slots__ in der Python-Klasse
[Road to Intermediate Python] Verwenden Sie Lambda-Ausdrücke
[Road to Intermediate Python] Zusammenfassung der Artikelverknüpfungen
Registrieren Sie Funktionsargumente automatisch in argparse in Python
[Road to Intermediate] Python scheint alles Objekte zu sein
Fallklasse in Python
Klassennotation in Python
So definieren Sie Decorator und Decomaker mit einer Funktion
Konvertieren / Zurückgeben von Klassenobjekten in das JSON-Format in Python
[Road to Intermediate] Verwenden Sie die in Python integrierten Funktionsvariablen
Covector, um in Funktion zu denken
Erstellen Sie eine Funktion in Python
So löschen Sie stdout in Python
Verwenden Sie die Rückruffunktion in Python
ntile (Dezil) -Funktion in Python
Melden Sie sich auf der Website in Python an
Nichtlineare Funktionsmodellierung in Python
Zeichne die Yin-Funktion in Python
Sprechen mit Python [Text zu Sprache]
Sofortige Funktion (Lüge) in Python
Wie man in Python entwickelt
Post an Slack in Python
Verwendung der Methode __call__ in der Python-Klasse
So definieren Sie mehrere Variablen in einer Python for-Anweisung
Wie man aus einer Wahrscheinlichkeitsdichtefunktion in Python tastet
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
[Road to Intermediate Python] Aktiviert Vergleichsoperationen mit Originalklassen
[Python] Wie man PCA mit Python macht
Implementieren Sie die Funktion power.prop.test von R in Python
Definition des Funktionsargumenttyps in Python
Inklusive Notation im Argument der Python-Funktion
In Python-Klassenvariablen versteckte Landminen
So sammeln Sie Bilder in Python
[Road to Intermediate Python] Geben Sie die Ausführungsmethode dynamisch anhand des Variablennamens an
[Python 3.8 ~] Wie man rekursive Funktionen mit Lambda-Ausdrücken intelligent definiert
Verwendung von SQLite in Python
Schreiben Sie die AWS Lambda-Funktion in Python
Lesen Sie PNG-Chunks in Python (Klassenausgabe)
Messen Sie die Ausführungszeit von Funktionen in Python
Im Python-Befehl zeigt Python auf Python3.8
Versuchen Sie, Trace in Python zu berechnen
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
Weg zu Intermediate Linux: Network Edition
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python