2011-05-14 9 views
9

bir sınıf özelliği olarak bir işlevi olamaz. Ancak, Python "yardımsever" Benim için bir yöntem haline döner:Bir sınıf sabiti olarak bir düz eski işlevini sahip olmak istiyorum Python

class C(object): 
    a = 17 
    b = (lambda x : x+1) 

print C.a  # Works fine for int attributes 
print C.b  # Uh-oh... is a <unbound method C.<lambda>> now 
print C.b(1) # TypeError: unbound method <lambda>() must be called 
       # with C instance as first argument (got int instance instead) 
  • bir yöntem haline gelen benim fonksiyonunu önlemek için bir yolu var mı? Her durumda
  • , bu soruna iyi "Pythonic" yaklaşımı nedir?

cevap

18

durukyöntem:

class C(object): 
    a = 17 

    @staticmethod 
    def b(x): 
     return x+1 

Veya:

class C(object): 
    a = 17 
    b = staticmethod(lambda x : x+1) 
3

Kullanım staticmethod:

class C(object): 
    a = 17 
    @staticmethod 
    def b(x): 
     return x + 1 
+0

Ancak bu uyarıları dikkate almalısınız (http://stackoverflow.com/questions/5212071/python-class-de oturum durukyöntem-vs-yöntemde/5212190 # 5212190). – senderle

3

sınıfında bir modülde ama senin işlevi tanımlayın. Senin durumunda daha iyi. Normal piton yönteminin

ilk menü noktası self, self bir örnek nesnesi zorunluluktur.

Eğer durukyöntem kullanmalısınız:

class C(object): 
    a = 17 
    b = staticmethod(lambda x: x+1) 
print C.b(1) 
# output: 2 

veya self parametreyi ekleyin ve C örneğini yapmak: Başka bir seçenek classmethod kullanıyor

class C(object): 
    a = 17 
    b = lambda self, x: x+1 
c = C() 
c.b(1) 
# output: 2 

(sadece bunu yapabilirsiniz göstermek):

class C(object): 
    a = 17 
    b = classmethod(lambda cls, x: x+1) 
C.b(1) 
# output: 2 
+1

İlginç - lambda'lar çok durukyöntem/classmethod sarılmış gerekmektedir. Bundan önce farkında değildim. –

İlgili konular