Vous permet également de faire ceci: (en bref, invoquer Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
retournera 12, mais le fera de la manière la plus folle.
class Outer(object):
def __init__(self, outer_num):
self.outer_num = outer_num
def create_inner_class(outer_self, inner_arg):
class Inner(object):
inner_arg = inner_arg
def weird_sum_with_closure_scope(inner_self, num)
return num + outer_self.outer_num + inner_arg
return Inner
Bien sûr, c'est plus difficile à imaginer dans des langages comme Java et C #. En rendant l'auto-référence explicite, vous êtes libre de faire référence à n'importe quel objet par cette auto-référence. De plus, une telle façon de jouer avec des classes à l'exécution est plus difficile à faire dans les langages les plus statiques - ce n'est pas nécessairement une bonne ou une mauvaise chose. C'est juste que le moi explicite permet à toute cette folie d'exister.
De plus, imaginez ceci: nous aimerions personnaliser le comportement des méthodes (pour le profilage, ou de la magie noire folle). Cela peut nous amener à penser: et si nous avions une classeMethod
dont nous pouvions outrepasser ou contrôler le comportement?
Et bien voilà:
from functools import partial
class MagicMethod(object):
"""Does black magic when called"""
def __get__(self, obj, obj_type):
# This binds the <other> class instance to the <innocent_self> parameter
# of the method MagicMethod.invoke
return partial(self.invoke, obj)
def invoke(magic_self, innocent_self, *args, **kwargs):
# do black magic here
...
print magic_self, innocent_self, args, kwargs
class InnocentClass(object):
magic_method = MagicMethod()
Et maintenant: InnocentClass().magic_method()
agira comme prévu. La méthode sera liée au innocent_self
paramètre to InnocentClass
et magic_self
à l'instance MagicMethod. Bizarre hein? C'est comme avoir 2 mots clés this1
etthis2
dans des langages comme Java et C #. La magie comme celle-ci permet aux frameworks de faire des choses qui seraient autrement beaucoup plus verbeuses.
Encore une fois, je ne veux pas commenter l'éthique de ce genre de choses. Je voulais juste montrer des choses qui seraient plus difficiles à faire sans une référence explicite.
self
pour accéder aux membres - stackoverflow.com/questions/910020/…