[PYTHON] Déclarer dynamiquement la classe comme une fermeture

Par exemple, lors de la déclaration de class-based-view dans django, même s'il s'agit d'une classe similaire Quoi qu'il en soit, c'est un problème à déclarer à chaque fois! Y a-t-il quelque chose comme ça? J'ai.

Donc, il y a quelque chose qui s'appelle une «fonction plus proche» là-bas. Un exemple est ci-dessous. En Python, vous pouvez écrire comme ci-dessous.

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()

Dans ce cas, il est abstrait sous la forme de "fonction à multiplier par n", en fait "combien de fois la fonction est nécessaire" est créé avec fermeture_factory, puis il est exécuté. Il est en forme.

Je ne sais pas parce que je n'ai pas vu le comportement de Python en détail, mais il semble que la classe est générée au "timing déclaré". Par conséquent, il est possible de déclarer une classe comme une fermeture comme indiqué ci-dessous.

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()

Ce qui me rend heureux lorsque je crée une fabrique de classes comme celle-ci, c'est que lorsque je crée une classe où je n'ai besoin que de modifier certains paramètres, je n'ai pas à déclarer à chaque fois, et je déclare uniquement les parties modifiées des paramètres. Il y a un mérite que vous pouvez améliorer simplement en le donnant (probablement).

Cependant, d'un autre côté, si cette usine est appelée plusieurs fois, ce qui va arriver aux performances de traitement peut être fastidieux, donc cela peut dépendre du moment d'utilisation.

Recommended Posts

Déclarer dynamiquement la classe comme une fermeture
Profil dans une méthode de la classe
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__