2011-05-14 39 views
9

我想要一個普通的舊函數作爲類常量。然而,Python的「有益」它變成了一種我:不能在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) 
  • 有沒有辦法阻止我的功能成爲一個方法是什麼?
  • 無論如何,這個問題最好的「Pythonic」方法是什麼?

回答

18

靜態方法:

class C(object): 
    a = 17 

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

或者:

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

使用staticmethod

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

但你應該考慮[這些警告](http://stackoverflow.com/questions/5212071/python-class-de籤STATICMETHOD-VS-方法/ 5212190#5212190)。 – senderle 2011-05-14 03:25:12

3

定義的功能模塊中,但不是一流的。你的情況會更好。

正常python方法的第一個參數是self,self必須是一個實例對象。

你應該使用靜態方法:

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

或添加self參數,使C的一個實例:

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

另一個選擇是使用類方法(只顯示你可以做到這一點):

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

有趣的 - lambda需要被包裝在staticmethod/classmethod中。我以前沒有意識到這一點。 – 2014-03-21 12:31:28