Python:函数调用类属性消失后

时间:2012-11-11 16:16:08

标签: python user-interface

所以这样的问题,我无法弄明白。也许我的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之前调用了一次它并没有给我错误。

可能导致这种情况发生的原因是什么?

2 个答案:

答案 0 :(得分: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](再次,没有其他事情发生)。
  4. 您要做的是将其写在一行:

    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)
    

答案 1 :(得分:0)

一些注释可以帮助您编写更多“Pythonic”代码:

  • 您的代码不是非常Pythonic。您无需在此使用range();您可以使用行数较少且更清晰的for ... in构造。但这不是你的主要问题。
  • 应该重写
  • sortByPriority()以使用内置的Python排序功能;你可以给它一个任意的函数来对两个比较器进行排序。这就是你想要在这里做的,而不是重写sort()

你做的一件事就是我咬了几次就是你在迭代它的过程中对列表进行排序。这给我带来了奇怪的行为,包括破损。这可能适合您的使用,但在您完成调整列表中所需的所有内容之前,您应该考虑不对其进行排序。

最后,我看不到你在哪里创建listofjobst。那是一个错字吗?