簡體   English   中英

Python:函數調用后的類屬性消失

[英]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] 由於換行符,這將執行以下操作:

  1. listOfJobs[j - 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的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”代碼:

  • 您的代碼不是Python語言。 您無需在此處使用range() 您可以將for ... in行數更少,更清晰的結構中。 但這不是您的主要問題。
  • 應該重寫sortByPriority()以使用內置的Python sort函數; 您可以給它提供一個任意函數來對兩個比較器進行排序。 這實際上是您想要在此處執行的操作,而不是重寫sort()

您正在做的一件事讓我很痛苦,這是您在迭代列表時正在對列表進行排序。 過去這對我造成了奇怪的行為,包括斷裂。 這可能適合您的使用,但是您應該考慮對列表中的所有內容進行調整之前,不要對其進行排序。

最后,我看不到您在哪里創建listofjobst 那是錯字嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM