Pozwala również na to: (w skrócie, wywołanie Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
zwróci 12, ale zrobi to w najbardziej szalony sposób.
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
Oczywiście trudniej to sobie wyobrazić w językach takich jak Java i C #. Wyraźnie określając odniesienie do siebie, możesz swobodnie odwoływać się do dowolnego obiektu za pomocą tego odniesienia. Ponadto taki sposób grania z klasami w czasie wykonywania jest trudniejszy do wykonania w bardziej statycznych językach - niekoniecznie jest to dobre lub złe. Chodzi tylko o to, że jawne ja pozwala istnieć całym tym szaleństwu.
Co więcej, wyobraź sobie: Chcielibyśmy dostosować zachowanie metod (do profilowania lub jakiejś szalonej czarnej magii). Może to nas skłonić do myślenia: co by było, gdybyśmy mieli klasę, Method
której zachowanie moglibyśmy zmienić lub kontrolować?
Cóż, oto jest:
from functools import partial
class MagicMethod(object):
"""Does black magic when called"""
def __get__(self, obj, obj_type):
return partial(self.invoke, obj)
def invoke(magic_self, innocent_self, *args, **kwargs):
...
print magic_self, innocent_self, args, kwargs
class InnocentClass(object):
magic_method = MagicMethod()
A teraz: InnocentClass().magic_method()
będzie działać zgodnie z oczekiwaniami. Metoda zostanie powiązana z innocent_self
parametrem to InnocentClass
i z magic_self
instancją MagicMethod. Dziwne co? To tak, jakby 2 słowa kluczowe this1
i this2
w językach takich jak Java i C #. Taka magia pozwala frameworkom robić rzeczy, które w innym przypadku byłyby znacznie bardziej szczegółowe.
Ponownie, nie chcę komentować etyki tych rzeczy. Chciałem tylko pokazać rzeczy, które byłyby trudniejsze do zrobienia bez wyraźnego odniesienia do siebie.
self
aby uzyskać dostęp do członków - stackoverflow.com/questions/910020/…