2012-11-11 21 views
-1

所以這樣的問題,我無法弄清楚。也許我對Python的知識太少了。Python:函數調用後類屬性消失

問題是,該函數運行一次後,順利,另一次我得到另一個函數的錯誤。

功能,在這之後的事情打破:

def setFixedPriority(self, priority, lister): 
    step = priority/lister . __len__ () 
    for j in range(0, lister . __len__()): 
     for i in range(0, self . listOfJobs . __len__ ()) : 
      if self . listOfJobs[ i ] . category == lister[ j ]: 
       self . listOfJobs[ i ] . priority += priority 
      elif self . listOfJobs[ i ] . jobType == lister[ j ]: 
       self . listOfJobs[ i ] . priority += priority 
      elif self . listOfJobs[ i ] . timeToDo == lister[ j ]: 
       self . listOfJobs[ i ] . priority += priority 
     priority -= step 
      self . sortByPriority() 

功能中出現的問題:

def sortByPriority(self) : 
    tmp = range (1, self . listOfJobs . __len__ () + 1) 
    for i in reversed (tmp) : 
     for j in range (1, i) : 
      if self . listOfJobs [ j - 1 ] . priority < self . listOfJobs [ j ] . priority : 
       self . listOfJobs [ j - 1 ], 
       self . listOfJobs [ j ] = self . listOfJobst [ j ], 
       self . listOfJobs [ j - 1 ] 

調用函數(從不同的Python腳本/文件/類):

self . jobs . setFixedPriority(int(self . settings[ 'Spinbox1' ]), self . settings[ 'type' ] . split(":")) 

而我得到的錯誤:

File "data/ToDoListClass.py", line 82, in sortByPriority 
    self . listOfJobs [ j ] = self . listOfJobst [ j ], 
    AttributeError: jobList instance has no attribute 'listOfJobst' 

我知道sortByPriority工作正常,因爲我在setFixedPriority之前調用過一次,它不會給我錯誤。

什麼可能導致這種情況發生?

+3

不要直接訪問像'__len__'這樣的特殊方法。使用'len(x')。 – poke

+1

此外,在調用''.''之間放置空格被認爲是一個非常奇怪的風格,因爲在任何方括號之前和之內放置空格。查看[PEP-8](http://www.python.org/dev/peps/pep-0008/)瞭解建議的樣式。 –

+0

事實上,這整個事情看起來像混淆的代碼。循環遍歷索引在Python中是非常糟糕的風格(循環直接在項目上),並且循環遍歷1索引索引甚至更加怪異。 –

回答

4
AttributeError: jobList instance has no attribute 'listOfJobst' 

如果仔細觀察,您會發現錯字。該屬性被稱爲listOfJobs,沒有尾隨t

注意的是,雖然這會令錯誤去,這可能不會修復功能:

self . listOfJobs [ j - 1 ], 
self . listOfJobs [ j ] = self . listOfJobs [ j ], 
self . listOfJobs [ j - 1 ] 

該構造可能是應該換listOfJobs[j]listOfJobs[j - 1]。由於換行符,這會做以下,但:

  1. 撥打一個元組與listOfJobs[j - 1](沒有帶別的東西出現這種情況)
  2. 分配一個元組與listOfJobs[j]listOfJobs[j]
  3. 訪問listOfJobs[j - 1](再次,沒有其他事情發生)。

你想要做的就是寫它要麼在同一行:

self.listOfJobs[j - 1], self.listOfJobs[j] = self.listOfJobs[j], self.listOfJobs[j - 1] 

或者,如果你想保持換行符,使用Python的\語法,使線繼續:

self.listOfJobs[j - 1], \ 
self.listOfJobs[j] = self.listOfJobs[j], \ 
self.listOfJobs[j - 1] 

雖然我會爭論是否真的清楚發生了什麼。

最後,你可以清理你的代碼了很多。您可以直接遍歷列表,並且還可以在單​​個if中檢查多個條件。最後,Python的排序功能允許您指定自定義比較函數,以便您不需要實現自己的排序算法,但可以使用Python的實現。總而言之,你可以舉例來說,就像這樣:

def setFixedPriority (self, priority, listers): 
    step = priority/len(listers) 
    for lister in listers: 
     for job in self.listOfJobs: 
      if job.category == lister or job.jobType == lister or job.timeToDo == lister: 
       job.priority += priority 

     priority -= step 

    self.listOfJobs.sort(key=lambda x: x.priority) 
+1

更好的是'self.listOfJobs.sort(key = lambda x:x.priority)' – Eric

+0

@Eric好點,改變它。謝謝! – poke

0

的幾個注意事項,這將有助於你寫更多的「Python化」代碼:

  • 你的代碼不是很Python的。這裏您不需要使用range();您可以使用for ... in結構更少且更清晰的結構。但那不是你的主要問題。
  • sortByPriority()應該重寫爲使用內置的Python排序函數;你可以給它一個任意的函數來排序兩個比較器。這真的是你想要做的,而不是重寫sort()

你正在做的事情有一點讓我感到困擾了幾次,就是你在迭代它的過程中排序了一個列表。這在過去造成了奇怪的行爲,包括破碎。這可能適用於您的使用,但您應該考慮不要對它進行排序,直到您完成列表中的所有內容調整。

最後,我沒有看到您創建的位置listofjobst。這是一個錯字嗎?

+0

儘管這是真的,但這不是一個答案。 –

+0

是的,如果'listofjobst'是一個錯字,它是一個答案(它符合錯誤信息)。如果這種排序有什麼問題或者它是如何被調用的,把它放在最後也會解決問題。最後,如果在點A中創建'listofjobst',然後在點B中用於排序,這兩者將結合起來以產生上述錯誤。似乎絕對值得一試。 – jwyllie83

+0

啊,對不起,這是我沒有完全讀完它。 –