繁体   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