También le permite hacer esto: (en resumen, la invocación Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
devolverá 12, pero lo hará de la manera más loca.
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
Por supuesto, esto es más difícil de imaginar en lenguajes como Java y C #. Al hacer explícita la autorreferencia, puede referirse a cualquier objeto mediante esa autorreferencia. Además, tal forma de jugar con las clases en tiempo de ejecución es más difícil de hacer en los idiomas más estáticos, no es necesariamente bueno o malo. Es solo que el ser explícito permite que exista toda esta locura.
Además, imagine esto: nos gustaría personalizar el comportamiento de los métodos (para perfilar, o alguna magia negra loca). Esto puede llevarnos a pensar: ¿qué pasaría si tuviéramos una clase Method
cuyo comportamiento podríamos anular o controlar?
Pues aquí está:
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()
Y ahora: InnocentClass().magic_method()
actuará como se esperaba. El método estará vinculado con el innocent_self
parámetro a InnocentClass
, y con la magic_self
instancia de MagicMethod. Raro eh? Es como tener 2 palabras clave this1
y this2
en lenguajes como Java y C #. Magia como esta permite que los frameworks hagan cosas que de otro modo serían mucho más detalladas.
Nuevamente, no quiero comentar sobre la ética de estas cosas. Solo quería mostrar cosas que serían más difíciles de hacer sin una autorreferencia explícita.
self
a los miembros de acceso - stackoverflow.com/questions/910020/...