2017-04-19 51 views
-1

我喜歡製作真正的模塊化程序,但很難追蹤哪些功能是其他功能的子程序。因此,我想定義父函數內的子例程。用Python的函數對象定義,這將是一個有力的實現:如何製作模塊化功能?

>>> def football(): 
...  self = football 
... 
...  logo = "Nike" 
... 
...  self.display_logo(self) 
... 
>>> def display_logo(self): 
...  print(self.logo) 

>>> football.display_logo = display_logo 

>>> football() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in football 
    File "<stdin>", line 2, in display_logo 
AttributeError: 'function' object has no attribute 'logo' 

不幸的是,這是行不通的。它也不是通過嘗試自己訪問「標識」來工作的。我可以用自己定義函數中的每個變量。前綴,但是有沒有更實用的方法來創建可以在調用時訪問父函數內部變量的子例程?

+6

你應該考慮做一個類,而不是試圖用普通函數做這個。 – BrenBarn

回答

0

這個錯誤是因爲自我,該參數display_logo,是不是你認爲你有屬性的對象。如果您嘗試逐行瀏覽代碼,則會發現各種問題。最大的問題是你使用變量,就好像你有一個類定義了一個對象,但你從來沒有定義過一個類。大多數情況下,您使用的名稱只是簡單的名稱,沒有特殊的含義。只要你嘗試以特殊的方式使用它們,Python就會給你一個錯誤信息。

你需要按照一個簡單的教程製作課程。你想要看起來更像這樣:

class Football(): 
    def __init__(self): 
     self.logo = "Nike" 
     self.display_logo() 

    def display_logo(self): 
     print(self.logo) 

Football() 

這有幫助嗎?

+1

錯誤與您所寫的內容無關。 OP在'self.logo ='Nike''中簡單地錯過了'self'。其餘的是正確的,儘管是非常糟糕的面向對象。他們正在使用函數對象作爲對象... – JBernardo

+0

我追求設計的錯誤。是的,你可以通過這個簡單的改變來創建語法*合法*,但是功能遠不是OP所期望的。 – Prune

+0

其實它不是。嘗試執行我上面寫的更改並運行他的代碼 – JBernardo

0

嘗試使用一些實際的OOP

class Football: 
    def __init__(self): 
     self.logo = 'Nike' 
     self.display_logo() 

    def display_logo(self): 
     print(self.logo) 

football = Football()