これを行うこともできます:(要するに、呼び出し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/...