[PYTHON] Deklarieren Sie die Klasse dynamisch wie einen Abschluss

Zum Beispiel, wenn klassenbasierte Ansicht in django deklariert wird, auch wenn es sich um eine ähnliche Klasse handelt Unabhängig davon ist es mühsam, jedes Mal zu deklarieren! Gibt es so etwas? Ich habe.

Es gibt also so etwas wie eine "engere Funktion". Ein Beispiel ist unten. In Python können Sie wie folgt schreiben.

python


# -*- coding: utf-8 -*-


def closure_factory(number):
    def _closure(some_integer):
        return number * some_integer
    return _closure


def closure_test():

    for x in range(10):
        func = closure_factory(x)
        for y in range(10):
            print func(y)


if __name__ == '__main__':
    closure_test()

In diesem Fall wird es in Form von "Funktion zum Multiplizieren mit n" abstrahiert, tatsächlich wird "wie oft die Funktion benötigt wird" mit "Closure_Factory" erstellt und dann ausgeführt. Es ist in Form.

Ich weiß es nicht, weil ich das Verhalten von Python nicht im Detail gesehen habe, aber es scheint, dass die Klasse zum "deklarierten Zeitpunkt" generiert wird. Daher ist es möglich, eine Klasse wie unten gezeigt als Abschluss zu deklarieren.

python


# -*- coding: utf-8 -*-


def testfactory(hoge):

    class TestClass(object):
        number = hoge

        def say(self):
            print self.number

    return TestClass


def main():

    for x in range(30):
        klass = testfactory(x)
        klass().say()

Was mich glücklich macht, wenn ich eine Klassenfactory wie diese erstelle, ist, dass ich beim Erstellen einer Klasse, in der ich nur einige Parameter ändern muss, nicht jedes Mal deklarieren muss und nur die geänderten Teile der Parameter deklariere. Es gibt einen Vorteil, den Sie verbessern können, wenn Sie ihn (wahrscheinlich) geben.

Wenn diese Factory jedoch mehrmals aufgerufen wird, kann das, was mit der Verarbeitungsleistung geschieht, lästig sein, sodass dies vom Zeitpunkt der Verwendung abhängen kann.

Recommended Posts

Deklarieren Sie die Klasse dynamisch wie einen Abschluss
Profil innerhalb einer Methode der Klasse
[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf