Também permite que você faça o seguinte: (em resumo, chamar Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
retornará 12, mas o fará da maneira mais louca possível.
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
Obviamente, isso é mais difícil de imaginar em linguagens como Java e C #. Ao tornar explícita a auto-referência, você pode se referir a qualquer objeto por essa auto-referência. Além disso, essa maneira de brincar com as classes em tempo de execução é mais difícil nas linguagens mais estáticas - não é necessariamente boa ou ruim. Só que o eu explícito permite que toda essa loucura exista.
Além disso, imagine o seguinte: gostaríamos de personalizar o comportamento dos métodos (para criação de perfil ou alguma magia negra louca). Isso pode nos levar a pensar: e se tivéssemos uma classe Method
cujo comportamento poderíamos substituir ou controlar?
Bem, aqui 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()
E agora: InnocentClass().magic_method()
agirá como esperado. O método será vinculado ao innocent_self
parâmetro to InnocentClass
e magic_self
à instância MagicMethod. Estranho né? É como ter duas palavras this1
- chave e this2
em linguagens como Java e C #. Magias como essa permitem que estruturas façam coisas que seriam muito mais detalhadas.
Novamente, não quero comentar sobre a ética dessas coisas. Eu só queria mostrar coisas que seriam mais difíceis de fazer sem uma auto-referência explícita.
self
para acessar membros. - stackoverflow.com/questions/910020/…