Ayrıca bunu yapmanıza izin verir: (kısaca, çağırmak Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
12 geri döner, ancak bunu en çılgın yollarla yapar.
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
Tabii ki, bu Java ve C # gibi dillerde hayal etmek daha zordur. Öz referansı açık hale getirerek, herhangi bir nesneye söz konusu referansla başvurabilirsiniz. Ayrıca, çalışma zamanında sınıflarla böyle bir oyun oynamanın daha statik dillerde yapılması daha zordur - bu mutlaka iyi veya kötü değildir. Sadece açık benlik tüm bu deliliğin var olmasına izin verir.
Dahası, şunu hayal edin: Yöntemlerin davranışını özelleştirmek istiyoruz (profilleme veya çılgın kara büyü için). Bu bizi düşünmemize yol açabilir: Method
ya davranışını geçersiz kılabileceğimiz ya da kontrol edebileceğimiz bir sınıfımız olsaydı ?
İşte burada:
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()
Ve şimdi: InnocentClass().magic_method()
beklendiği gibi davranacak. Yöntem , MagicMethod örneğine ve innocent_self
parametresine bağlı olacaktır . Tuhaf ha? 2 anahtar kelimeye sahip olmak ve Java ve C # gibi dillerde kullanmak gibi. Bunun gibi sihir, çerçevelerin aksi halde çok daha ayrıntılı olacak şeyler yapmasına izin verir.InnocentClass
magic_self
this1
this2
Yine, bu tür şeyler hakkında yorum yapmak istemiyorum. Sadece açık bir öz referans olmadan yapılması zor olan şeyleri göstermek istedim.
self
üyelere erişmek için neden açıkça yazmanız gerektiğini bilmek istersiniz - stackoverflow.com/questions/910020/…