อนุญาตให้คุณทำสิ่งนี้ด้วย: (ในระยะสั้นการเรียกใช้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 # เวทย์มนตร์เช่นนี้อนุญาตให้เฟรมเวิร์กทำสิ่งต่าง ๆ ที่จะเป็น verbose มากขึ้น
อีกครั้งฉันไม่ต้องการที่จะแสดงความคิดเห็นเกี่ยวกับจริยธรรมของสิ่งนี้ ฉันแค่อยากจะแสดงสิ่งต่าง ๆ ที่ยากที่จะทำโดยไม่มีการอ้างอิงด้วยตนเองอย่างชัดเจน
self
ถึงสมาชิกอย่างชัดเจน- stackoverflow.com/questions/910020/ …