Ti permette anche di fare questo: (in breve, invocare Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
restituirà 12, ma lo farà nel modo più 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
Ovviamente, questo è più difficile da immaginare in linguaggi come Java e C #. Rendendo esplicito il riferimento personale, sei libero di fare riferimento a qualsiasi oggetto con quel riferimento automatico. Inoltre, un tale modo di giocare con le classi in fase di esecuzione è più difficile da fare nei linguaggi più statici - non è necessariamente buono o cattivo. È solo che il sé esplicito permette a tutta questa follia di esistere.
Inoltre, immagina questo: vorremmo personalizzare il comportamento dei metodi (per la profilazione o qualche pazza magia nera). Questo può portarci a pensare: e se avessimo una classe il Method
cui comportamento potremmo ignorare o controllare?
Bene eccolo qui:
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 ora: InnocentClass().magic_method()
agirà come previsto. Il metodo verrà associato con il innocent_self
parametro to InnocentClass
e con l' magic_self
istanza MagicMethod. Strano eh? È come avere 2 parole chiave this1
e this2
in lingue come Java e C #. Magia come questa consente ai framework di fare cose che altrimenti sarebbero molto più dettagliate.
Ancora una volta, non voglio commentare l'etica di questa roba. Volevo solo mostrare cose che sarebbero più difficili da fare senza un esplicito riferimento di sé.
self
per accedere ai membri - stackoverflow.com/questions/910020/…