2012-06-15 67 views
0

我試圖從另一個方法來訪問內部方法蟒蛇但這樣做它給我「AttributeError的:‘功能’對象有沒有屬性‘B’」訪問內部方法在Python從另一種方法

我情景是:

class Foo: 
    def first_method(self): 
     something 
     def test(self): 
      print 'Hi' 

    def second_method(self): 
     a = self.test() 

a = self.test()引發錯誤。

+3

如果你想'test()'是一個普通的'Foo'方法,是否有任何理由不把'test()'定義爲'Foo'的普通方法,而是作爲一個局部函數'first_method()'? –

+2

你不能。你爲什麼要這樣? – schlamar

回答

6

函數test僅在本地範圍first_method中可用。如果你想在其他函數中訪問它,你將不得不在某處保留對它的引用。類似以下內容將起作用:

>>> class Foo: 
...  def first_method(self): 
...   def test(): 
...   print 'Hi' 
...   self.test = test 
...  def second_method(self): 
...   self.test() 
... 
>>> f = Foo() 
>>> f.second_method() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 7, in second_method 
AttributeError: Foo instance has no attribute 'test' 
>>> f.first_method() 
>>> f.second_method() 
Hi 

請注意,代碼中的問題有幾處更改。例如,函數test不帶任何參數。還請注意,必須在second_method之前調用first_method

+3

請注意,分配給實例屬性的函數不是方法;他們在被調用時無法訪問實例,即他們不會傳遞「self」。 –

+2

@SvenMarnach他們不會傳遞'self',但正如在這段代碼中那樣,並不意味着他們無法訪問它(感謝閉包語義)。此外,通過執行'self.test = types.MethodType(test,self)',在其他上下文中可以解決該問題。 – lvc

+3

@lvc:完全同意。我只是認爲這是一個需要注意的問題,特別是因爲OP爲本地函數test()使用了明確的'self'參數。 –