2014-04-03 49 views
3

我正在嘗試在一個類中創建可執行函數的字典。但無法使自我參數正常工作。帶有一個類內函數字典的自參數

考慮下面的代碼:

class myclass(object): 

    def x(self): 
    return 'x' 

    def y(self): 
    return 'y' 

    EF= { 
    'a':x, 
    'b':y, 
    } 

    def test(self): 
    print self.EF['a']() 

當我試圖執行類的「測試」功能,我避開參數的數量錯誤,因爲它評估和執行中的功能之一字典。

>>> class myclass(object): 
... def x(self): 
... return 'x' 
... def y(self): 
... return 'y' 
... EF= { 
... 'a':x, 
... 'b':y, 
... } 
... def test(self): 
...  print self.EF['a']() 
... 
>>> 
>>> 
>>> m=myclass() 
>>> m.test() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 11, in test 
TypeError: x() takes exactly 1 argument (0 given) 

我已經嘗試了一些變化,包括這不起作用。

EF= { 
    'a':self.x, 
    'b':self.y, 
    } 

唯一沒有工作的是當我明確地將自我作爲參數傳遞時,像這樣。

... def test(self): 
...  print self.EF['a'](self) 
... 
>>> m=myclass() 
>>> m.test() 
x 

我已經看到關於使用字典索引函數的其他問題,但沒有一個在類內。

這裏是我的問題:

  • 什麼是做處理自我參數的正確方法是什麼?
  • 我寧願將我的字典常量外的類移動到我的常量部分。我能做到嗎,如果是的話,怎麼做?我應該這樣做嗎?
  • 如果我應該/必須在我的課堂上有我的字典,爲什麼我不能將它移動到課程頂部?

這就是我得到的。謝謝您的幫助。

回答

3

什麼是正確的方法來處理自我參數?

Python使用以類似的方式使用this標識符其他命令式語言的self標識,但它是明確的(顯式勝於隱!)

這可以讓你使用類作爲任何一個實例化對象或靜態類本身。

對於一個實例化的版本,你可能正在尋找

>>> class myclass: 
    def __init__(self): 
     self.EF = {'a':self.x,'b':self.y} 
    def x(self): 
     return 'x' 
    def y(self): 
     return 'y' 
    def test(self): 
     print self.EF['a']() 


>>> my_test_class = myclass() 
>>> my_test_class.test() 
x 

我寧願類的我的字典裏不斷向外移動的進入我的常量部分。我能做到嗎,如果是的話,怎麼做?我應該這樣做嗎?

如果你想使用他們在您的類定義之外的字典作爲靜態方法,你就需要使用@staticmethod裝飾

>>> class myclass(object): 
    @staticmethod 
    def x(): 
     return 'x' 
    @staticmethod 
    def y(): 
     return 'y' 


>>> EF = {'a':myclass.x,'b':myclass.y} 
>>> EF['a']() 
'x' 

如果我/有有我的字典中我的班級,爲什麼我不能把它移到班級的頂部?

任何對象屬性都應該在__init__函數中定義,或者通過明確設置它們來定義。

+0

看起來不錯,但我再次失去了選票......。 –

+0

太棒了。好的解釋也是如此。謝謝。聲明只在類中的類中使用的常量,還是應該放在__init__函數中,這是不錯的做法嗎? –

+0

@WesModes在python中並沒有真正的常量概念,但你總是可以使用['@ property'](https://docs.python.org/2/library/functions.html#property)裝飾器來完成你的需求。請參閱此鏈接以及:http://stackoverflow.com/questions/2682745/creating-constant-in-python –

1

有在init方法字典中會使其工作

class Myclass(object): 
     def x(self): 
       return 'x' 

     def y(self): 
       return 'y' 

     def __init__(self): 
       self.EF= { 
         'a':self.x, 
         'b':self.y 
       } 

     def test(self): 
       print self.EF['a']() 

m=Myclass() 
m.test() 
1

關於你的問題。該類是屬性和可執行函數的字典或命名元組。函數本身只定義行爲。 self是一個與你的實例相關的狀態。如果你在其他地方保存了一個指向該函數的指針,併爲它提供一個給定的self這是你的類的一個實例,它應該可以正常工作。

class MyClass(object): 
    def __init__(self, x): 
     self.x = x 
    def fun(self): 
     return self.x 

i = MyClass(1) 
print i.fun() 

f = MyClass.fun 
i2 = MyClass(2) 

print f(i2) 

當你調用使用標準i.fun()所有它做的是通過i在暗中爲self參數。

相關問題