2013-02-17 65 views
2

我有一個代碼,我想要在類函數中定義一個類函數。這是我想要做的一個簡單的例子。這個程序的目標是打印4.在類函數中定義類函數:Python

>>> class bluh: 
...  def haha(self): 
...    print 3 
...  def __init__(self): 
...    def haha(self): 
...      print 4 
... 
>>> x = bluh() 
>>> x.haha() 
3 

我應該怎麼寫這個程序來做我想要的?

+2

如果你的目標是打印4說不過去,你爲什麼要這樣做,而不是將'haha'定義爲常規方法?你以這種方式希望獲得什麼? – BrenBarn 2013-02-17 19:17:53

+1

我的目標不是*實際*打印4.這只是我想要做的更簡單的版本,它涉及控制語句,很多其他方法等。我幾乎在最後解釋了這一部分我的帖子,但最終決定,大多數常去這個網站的人可以弄清楚。 – IronBeard 2013-02-17 20:55:58

+0

關鍵是,你沒有解釋爲什麼你覺得有必要首先使用嵌套函數。 – BrenBarn 2013-02-17 20:56:41

回答

5

這真的取決於你想要做什麼。

>>> class Foo(object): 
...  def haha(self): 
...   print 3 
...  def __init__(self): 
...   def haha(): 
...    print 4 
...   self.haha = haha 
... 
>>> a = Foo() 
>>> a.haha 
<function haha at 0x7f4539e25aa0> 
>>> a.haha() 
4 

在前面的例子,haha實際上不是一個方法 - 這只是一個功能。但是它會從關閉和很多時候拿起對self的引用,這可能夠好了。如果你真的想monkeypatch/duck在實例上打一個新的方法,你需要使用types.MethodType。一個例子見here

0

這將從實例向類中添加一個方法。 在大多數情況下不是你想要做的事情,但語言使得它很簡單。

class A(object): 
    def __init__(self): 
     def foo(self): 
      print "bar" 
     self.__class__.foo = foo 

使用這樣的伎倆都可以當你建立某種形式的數據驅動的自修改代碼(不是每天都有的情況下對我們大多數人)

+1

每次有人做這樣的事情,Guido殺死一隻小貓,因此我聽說過。 – bereal 2013-02-17 19:21:54

+0

這取決於你要完成什麼。人們不應該經常這樣做,但我可以看到這種技術的一些很好的用處。 – mderk 2013-02-17 19:30:44

+1

實例影響班級,對我不利... – tdihp 2013-02-18 01:27:24