[英]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.