2012-03-14 31 views
11

Python 2.7.2 kullanıyorum. Bir işlevi çağırmak ve işlevin __call__ özniteliğini aramak arasındaki ilişkiyi anlamak istiyorum. Örneğin, dört satır fonksiyon foo çağırarak gösterir gibi görünmektedir aşağıdaki koduPython fonksiyonları ve bunların __call__ nitelik

def foo(): 
    return 5 
print foo()   # ==> 5 
print foo.__call__() # ==> 5 

foo.__call__ = lambda : 6 
print foo()   # ==> 5 
print foo.__call__() # ==> 6 

ilkleri dikkate foo ait __call__ niteliğini çağırarak aynıdır. Ancak, son üç satır I __call__ niteliği değişti ama foo() bir çağrı tarafından döndürülen değeri değişmedi çünkü onlar farklı hayvanlar olduklarını gösterir gibi görünmektedir.

birisi foo() arama ve foo.__call__() arayarak arasındaki ilişkiyi açıklayabilir misiniz? Işlevin davranışını değiştirmek için foo() ve foo.__call__() şimdi 5 yerine 6 döndürür bir yolu var mı?

+0

foo .__ call__' değiştirmek için bir neden yoktur asla - sadece yerine 'foo' değiştirebilir! – katrielalex

+0

yine de garip bir davranış. fonksiyonları nesnelerdir ve bunlar ('') vb aittir sınıf var beri, biz hiç önemli değil burada bir işlevle çalıştığınızdan nasıl gerçeği hakkında ayrıntılı gerektiğini –

cevap

11

Sana special method lookup for new-style classes (özellikle son paragraf) okumanızı öneririz. bir nesnenin türü, nesnenin örnek sözlükte değil üzerinde tanımlı ise yeni tarzı sınıfları için

, özel yöntemlerin örtük çağırmaları sadece düzgün çalışması için garanti edilir.

+2

iyi bir soru ... –