[英]Python: after function call class attribute dissapears
這樣的問題,我無法弄清楚。 也許我對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之前調用過一次,並且不會給我錯誤。
什么會導致這種情況發生?
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]
。 由於換行符,這將執行以下操作:
listOfJobs[j - 1]
創建一個元組( listOfJobs[j - 1]
什么也沒有發生) listOfJobs[j]
的一個元組分配給listOfJobs[j]
。 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的sort函數允許您指定自定義比較函數,這樣您就無需實現自己的排序算法,而是可以使用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)
一些注意事項將幫助您編寫更多的“ Pythonic”代碼:
range()
; 您可以將for ... in
行數更少,更清晰的結構中。 但這不是您的主要問題。 sortByPriority()
以使用內置的Python sort函數; 您可以給它提供一個任意函數來對兩個比較器進行排序。 這實際上是您想要在此處執行的操作,而不是重寫sort()
。 您正在做的一件事讓我很痛苦,這是您在迭代列表時正在對列表進行排序。 過去這對我造成了奇怪的行為,包括斷裂。 這可能適合您的使用,但是您應該考慮對列表中的所有內容進行調整之前,不要對其進行排序。
最后,我看不到您在哪里創建listofjobst
。 那是錯字嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.