Также позволяет вам сделать это: (короче говоря, вызов Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
вернет 12, но сделает это самым безумным способом.
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
Конечно, это сложнее представить в таких языках, как Java и C #. Сделав ссылку на себя явной, вы можете ссылаться на любой объект по этой ссылке. Кроме того, такой способ игры с классами во время выполнения сложнее сделать на более статичных языках - не обязательно это хорошо или плохо. Просто явное я допускает существование всего этого безумия.
Кроме того, представьте себе следующее: мы хотели бы настроить поведение методов (для профилирования или какой-то безумной черной магии). Это может привести нас к мысли: что если бы у нас был класс Method
, поведение которого мы могли бы переопределить или контролировать?
Ну вот оно:
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()
А теперь: InnocentClass().magic_method()
будет действовать как ожидалось. Метод будет связан с innocent_self
параметром InnocentClass
и magic_self
экземпляром MagicMethod. Странно, да? Это как иметь 2 ключевых слова this1
и this2
на таких языках, как Java и C #. Подобная магия позволяет фреймворкам делать вещи, которые в противном случае были бы гораздо более многословными.
Опять же, я не хочу комментировать этику этого материала. Я просто хотел показать вещи, которые было бы сложнее сделать без явной ссылки на себя.
self
для доступа к участникам - stackoverflow.com/questions/910020/…