2012-12-05 104 views
1

我想弄清楚如何在類的定義函數內部添加一個定義函數。什麼我想要做的Python代碼:如何在定義函數中添加一個定義

class Guy(): 
    def move(self): 
     def left(self): 
      //compute 
     def right(self): 
      //compute 
     def up(self): 
      //compute 
     def down(self): 
      //compute 

,然後可以在程序中以後調用Guy.move.right()。解釋器給我一個錯誤,說'函數沒有屬性權限'或類似的東西。有沒有辦法做到這一點,而不必將我的功能移出移動功能並將其稱爲Guy.right,Guy.left等?

+1

看看這個計算器後借來的: http://stackoverflow.com/questions/1589058/nested-function-in-python – aw4lly

回答

1

這是一個糟糕的方式代碼...

沒有辦法打電話Guy classleft功能,因爲它是在move功能的範圍內,而不像class,增加了功能內的另一個功能不使其成爲其屬性。

直到內部功能外功能的屬性有沒有辦法把它利用包圍函數的名稱

如果

def move(): 
    def left(): 

即如果裏面只有一個功能從move函數返回left()是可行的。

但是在這種情況下,move函數範圍內有多個函數。

你應該尋找的東西像一個nested classmoveclass,而不是一個功能

+0

有沒有什麼辦法,使一個函數封裝它的函數的屬性? –

+0

@EliasBenevedes:我建議你轉移到嵌套類的方法,但如果你仍然想繼續這種方法,你可以看看http://stackoverflow.com/questions/4273998/dynamically-calling-nested -functions基礎上,論證 – avasal

1

我會避免嵌套方法和功能。

您的move方法將在每次調用時重新編譯這些方向性方法,而這些方向性方法只能從move內調用。

也許你想要一個通用的move方法,它需要一個方向參數和自我?

def move(self, direction): 
    if direction == "left": 
     pass //do something 
    //etc 
2

函數通常不會將字段和其他函數暴露給外部作用域。這通常是物體的工作。但你可以用類似的東西...

class Guy(): 
    class Move(): 
     def __init__(self): 
      self.whatevs = "whatevs" 
     def left(self): 
      print("left") 
      pass 
      #compute 
     def right(self): 
      print("right") 
      pass 
      #compute 
     def up(self): 
      print("up") 
      pass 
      #compute 
     def down(self): 
      print("down") 
      pass 
      #compute 

    def __init__(self): 
     self.move = self.Move() 

guy = Guy() 
guy.move.left() 

我很確定這不是好的設計。爲什麼你想要做guy.move.left()有什麼原因嗎?一些優雅的想法,因爲它不是以其他方式,就像簡單。

0
class Guy(): 
    def move(self,dir): 
     def left(): 
      print "left!" 
     {'left':left}[dir]() 

Guy().move("left") 

會的工作,雖然我沒有看到它多大用處的情況下...

0

有一種方法來完成類似的原代碼的要求的東西: Guy.move()將呼叫轉移()函數, Guy.move.right(Guy())將會調用move.right函數。唯一的區別是我必須通過self對象move.right明確。

我不鼓勵任何人採取這條路線,更像'什麼蟒蛇可以做'的事情。

def to_attr(f): 
    import inspect 
    import new 
    for c in f.func_code.co_consts: 
     if inspect.iscode(c): 
      g = new.function(c, globals()) 
      setattr(f, g.func_name, g)  

    return f 

class Guy(object): 
    @to_attr 
    def move(self): 
     def left(self): 
      pass 
     def right(self): 
      print "Right" 
     def up(self): 
      pass 
     def down(self): 
      pass 
     print "Move" 

Guy.move.right(Guy()) 
Guy().move() 

inspect代碼從Introspecting a given function's nested (local) functions in Python