또한 이렇게하면 다음과 같은 작업을 수행 할 수 있습니다. (요컨대, 호출 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
매개 변수 to InnocentClass
및 magic_self
MagicMethod 인스턴스에 바인딩됩니다 . 허드? 2 개의 키워드가 this1
있고 this2
Java 및 C #과 같은 언어로되어 있습니다. 이와 같은 마술은 프레임 워크가 훨씬 더 장황한 것들을 할 수있게합니다.
다시, 나는이 물건의 윤리에 대해 언급하고 싶지 않다. 나는 명백한 자기 참조 없이는하기 어려운 것들을 보여주고 싶었습니다.
self
- 액세스 구성원 stackoverflow.com/questions/910020/...