Juga memungkinkan Anda untuk melakukan ini: (singkatnya, memohon Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
akan mengembalikan 12, tetapi akan melakukannya dengan cara yang paling gila.
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
Tentu saja, ini lebih sulit untuk dibayangkan dalam bahasa seperti Java dan C #. Dengan membuat referensi diri eksplisit, Anda bebas untuk merujuk ke objek apa pun dengan referensi diri itu. Selain itu, cara bermain dengan kelas saat runtime lebih sulit dilakukan dalam bahasa yang lebih statis - bukan berarti itu baik atau buruk. Hanya saja diri yang eksplisit memungkinkan semua kegilaan ini ada.
Selain itu, bayangkan ini: Kami ingin menyesuaikan perilaku metode (untuk profil, atau sihir hitam gila). Ini dapat membuat kita berpikir: bagaimana jika kita memiliki kelas Method
yang perilakunya dapat kita atur atau kendalikan?
Nah ini dia:
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()
Dan sekarang: InnocentClass().magic_method()
akan bertindak seperti yang diharapkan. Metode ini akan diikat dengan innocent_self
parameter ke InnocentClass
, dan dengan magic_self
ke instance MagicMethod. Aneh ya? Ini seperti memiliki 2 kata kunci this1
danthis2
dalam bahasa seperti Java dan C #. Sihir seperti ini memungkinkan kerangka kerja untuk melakukan hal-hal yang seharusnya jauh lebih bertele-tele.
Sekali lagi, saya tidak ingin mengomentari etika dari hal ini. Saya hanya ingin menunjukkan hal-hal yang akan lebih sulit dilakukan tanpa referensi diri yang eksplisit.
self
untuk mengakses anggota - stackoverflow.com/questions/910020/…