2010-10-14 14 views
14

içine durukyöntem arama Açıklama:Aşağıdaki örnek sınıfı göz önüne alındığında sınıf seviyesi konteynerler başlatma

class Foo: 

    def aStaticMethod(): 
     return "aStaticMethod" 

    aVariable = staticmethod(aStaticMethod) 
    aTuple = (staticmethod(aStaticMethod),) 
    aList = [staticmethod(aStaticMethod)] 

print Foo.aVariable() 
print Foo.aTuple[0]() 
print Foo.aList[0]() 

Neden olur düzgün aVariable eserlere ancak hata 'staticmethod' object is not callable döndürür aTuple ve aList ile çağrı?

cevap

16

Çünkü statik bir yöntem bir tanımlayıcıdır. Bir sınıfa eklediğinizde ve her zamanki sözdizimi ile çağırdığınızda, python çağrılabilir bir nesneyi döndüren __get__ yöntemini çağırır. Çıplak bir tanımlayıcı olarak ele aldığınızda, python hiçbir zaman __get__ yöntemini çağırmaz ve sonunda doğrudan tanımlanamayan tanımlayıcıyı çağırmaya çalışırsınız. Bunu aramak istiyorsanız

Yani, kendiniz için ayrıntıları doldurmak zorunda: Burada

>>> Foo.aTuple[0].__get__(None, Foo)() 
'aStaticMethod' 

, Noneinstance parametresi (açıklayıcısı erişildiğini bunun üzerine örneğine) geçirilir ve Foo, owner parametresine (tanımlayıcının bu örneğinin bulunduğu sınıf) geçirilir. Bu, gerçek bir callable işlevini döndürmesine neden olur:

>>> Foo.aTuple[0].__get__(None, Foo) 
<function aStaticMethod at 0xb776daac> 
İlgili konular