[PYTHON] Methodenaufruf mit __getattr__

Hintergrund

Ich verwende https://pypi.python.org/pypi/twitter als Twitter-API-Bibliothek, beachte jedoch, dass sich der Methodenaufruf geändert hat.

Über die Twitter-Bibliothek

Diese Bibliothek besteht nicht aus der direkten Übergabe der API-URL, sondern aus dem Aufruf der der API entsprechenden Methode. Wenn die API beispielsweise [users / show] lautet (https://dev.twitter.com/rest/reference/get/users/show), verwenden Sie die Methode "twitter.users.show ()". Die URL von users / show lautet übrigens https://api.twitter.com/1.1/users/show.json?screen_name=twitterdev Es sieht so aus.

Diese Methode ist jedoch nicht in der Twitter-Klasse und der TwitterCall-Klasse dieser Bibliothek implementiert, und die URL wird aus dem Methodennamen zusammengestellt, indem __getattr__ zum Aufrufen der API vollständig verwendet wird.

Beispielcode

Als Codebeispiel sieht es so aus

class A(object):
    def __init__(self, cls, urlparts):
        self.callable_cls = cls
        self.urlparts = urlparts 

    def __getattr__(self, k):
        print('called {}'.format(k))
        try:
            return object.__getattr__(self, k)
        except AttributeError:
            def extend_call(args):
                return self.callable_cls(self.callable_cls, self.urlparts + (args,))
            return  extend_call(k)

    def __call__(self, **kwargs):
        return self.urlparts

a = A(A, ())
res = a.users.show()
print(res)

Wenn Sie dies tun, wird als Ergebnis ein Tapple "(" Benutzer "," Show ")" zurückgegeben. Von nun an werde ich eine URL https://api.twitter.com/1.1/users/show.json?screen_name=twitterdev erstellen und aufrufen.

Als Erklärung gibt es beim Aufruf von "a.users" kein Feld oder keine Methode mit dem Namen "users", daher wird "getattr" aufgerufen. Darin wird extens_call (users) aufgerufen und als tapple zu self.urlparts hinzugefügt. Dann wird a.users.show aufgerufen, da es keine Methode namens "show" gibt. "Getattr" wird aufgerufen. Dies geht auch in "self.urlparts" als Taple. Wenn es schließlich als Methode aufgerufen wird, wird __call__ aufgerufen und gibt den Inhalt von self.urlparts zurück.

Zusammenfassung

Ich glaube nicht, dass ich diese Art der Implementierung verwenden würde, sondern als Hinweis

Recommended Posts

Methodenaufruf mit __getattr__
Datenvisualisierungsmethode mit Matplotlib (1)
Lineare Regressionsmethode mit Numpy
Datenvisualisierungsmethode mit Matplotlib (2)
SQL-Verbindungsmethode mit pyodbc
Datenvisualisierungsmethode mit Matplotlib (+ Pandas) (5)
Rauschentfernungsverfahren unter Verwendung der Wavelet-Umwandlung
Datenvisualisierungsmethode mit Matplotlib (+ Pandas) (4)
Teilen der Wasserkammmethode im 3D-Bild mit ImageJ
Sattelpunktsuche mit der Gradientenmethode