2016-08-30 13 views
10

Pythons'un Nesne modelinde a presentation okuyordum, bir slaytta (sayı 9), yazar Python'un işlevlerinin tanımlayıcı olduğunu iddia ediyor. fonksiyon Ben açıklaması bölümünde açıklandığı gibi bir __get__ bir açıklamadır tanımlar beri,İşlev tanımlayıcıları nasıl çalışır?

def mul(x, y): 
    return x * y 

mul2 = mul.__get__(2) 
mul2(3) # 6 

Şimdi, nokta yapılır anlıyoruz: o göstermek için sunulur örnek yazdığım buna benzer Python belgeleri.

Neyi anlamadığım, çıkışta sağlanan arama sonuçlarının tam olarak ne anlama geldiğidir.

cevap

12

Bu, Python'u işlevlere dinamik olarak ekleme işlevlerini desteklemek için yapıyor.

__get__ bir işlev nesnesinin (genellikle bir sınıfın bir örneği üzerinde nokta erişim . ile yapılır) Python ve dolaylı (genellikle self olarak kabul) örneği pass yönteme fonksiyonu dönüştürecek olarak çağrıldığında ilk argüman.

>>> mul2 
<bound method mul of 2> 
: açıkça
çağrı __get__ ve açıkça fonksiyonunun x ilk argüman olarak bağlıdır 'örneği' 2 geçmesi, burada 2 "örneği" self kabul edilir Senin durumunda

, sen

Bu, örnek 2'ye bağlanan, çarpmayı veren bir bağımsız argümanı olan bir yöntemle sonuçlanır: çağırarak, 2 döndürür (x'a atanan bağ argümanı) Başka bir deyişle, y argümanı olarak tedarik edersiniz.

Normalde function() sağladığı uygun argümanlarla __call__ var çağıran:

bir artı, fonksiyonlar için __get__ bir Python uygulaması olarak
mul.__call__(2, 3) # 6 

Python Dokümanlar Descriptor HOWTO belgesinde sağlanmaktadır.

class Function(object): 
    . . . 
    def __get__(self, obj, objtype=None): 
     "Simulate func_descr_get() in Objects/funcobject.c" 
     return types.MethodType(self, obj, objtype) 

Ve ilgisini ziyaretçi için kaynak kodu Objects/funcobject.c bulunur:

Burada __get__ çağrıldığında gerçekleşir types.MethodType kullanımı ile, dönüşüm görebilirsiniz.

Bu tanımlayıcının bulunup bulunmadığını görebildiğiniz gibi, types.MethodType işlevlerini, işlevsiz bir zorluk olan bir işleve dinamik olarak eklemek istediğinizde otomatik olarak işlevlerini tamamlamanız gerekir.

İlgili konular