Außerdem können Sie dies tun: (Kurz gesagt, das Aufrufen Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
gibt 12 zurück, dies jedoch auf die verrückteste Art und Weise.
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
In Sprachen wie Java und C # ist dies natürlich schwerer vorstellbar. Indem Sie die Selbstreferenz explizit machen, können Sie durch diese Selbstreferenz auf jedes Objekt verweisen. Außerdem ist eine solche Art, zur Laufzeit mit Klassen zu spielen, in den statischeren Sprachen schwieriger - nicht, dass es notwendigerweise gut oder schlecht ist. Es ist nur so, dass das explizite Selbst all diese Verrücktheit existieren lässt.
Stellen Sie sich außerdem Folgendes vor: Wir möchten das Verhalten von Methoden anpassen (für die Profilerstellung oder für verrückte schwarze Magie). Dies kann uns zum Nachdenken bringen: Was wäre, wenn wir eine Klasse hätten, Method
deren Verhalten wir überschreiben oder kontrollieren könnten?
Nun hier ist es:
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()
Und jetzt: InnocentClass().magic_method()
wird sich wie erwartet verhalten. Die Methode wird mit dem innocent_self
Parameter an InnocentClass
und mit magic_self
der MagicMethod-Instanz gebunden. Seltsam, oder? Es ist wie mit 2 Schlüsselwörtern this1
und this2
in Sprachen wie Java und C #. Magie wie diese ermöglicht es Frameworks, Dinge zu tun, die sonst viel ausführlicher wären.
Auch hier möchte ich die Ethik dieses Materials nicht kommentieren. Ich wollte nur Dinge zeigen, die ohne eine explizite Selbstreferenz schwieriger zu machen wären.
self
auf Mitglieder zuzugreifen - stackoverflow.com/questions/910020/…