2012-11-11 24 views
-1

所以这样的问题,我无法弄清楚。也许我对Python的知识太少了。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之前调用过一次,它不会给我错误。

什么可能导致这种情况发生?

+3

不要直接访问像'__len__'这样的特殊方法。使用'len(x')。 – poke

+1

此外,在调用''.''之间放置空格被认为是一个非常奇怪的风格,因为在任何方括号之前和之内放置空格。查看[PEP-8](http://www.python.org/dev/peps/pep-0008/)了解建议的样式。 –

+0

事实上,这整个事情看起来像混淆的代码。循环遍历索引在Python中是非常糟糕的风格(循环直接在项目上),并且循环遍历1索引索引甚至更加怪异。 –

回答

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](再次,没有其他事情发生)。

你想要做的就是写它要么在同一行:

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的排序功能允许您指定自定义比较函数,以便您不需要实现自己的排序算法,但可以使用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

更好的是'self.listOfJobs.sort(key = lambda x:x.priority)' – Eric

+0

@Eric好点,改变它。谢谢! – poke

0

的几个注意事项,这将有助于你写更多的“Python化”代码:

  • 你的代码不是很Python的。这里您不需要使用range();您可以使用for ... in结构更少且更清晰的结构。但那不是你的主要问题。
  • sortByPriority()应该重写为使用内置的Python排序函数;你可以给它一个任意的函数来排序两个比较器。这真的是你想要做的,而不是重写sort()

你正在做的事情有一点让我感到困扰了几次,就是你在迭代它的过程中排序了一个列表。这在过去造成了奇怪的行为,包括破碎。这可能适用于您的使用,但您应该考虑不要对它进行排序,直到您完成列表中的所有内容调整。

最后,我没有看到您创建的位置listofjobst。这是一个错字吗?

+0

尽管这是真的,但这不是一个答案。 –

+0

是的,如果'listofjobst'是一个错字,它是一个答案(它符合错误信息)。如果这种排序有什么问题或者它是如何被调用的,把它放在最后也会解决问题。最后,如果在点A中创建'listofjobst',然后在点B中用于排序,这两者将结合起来以产生上述错误。似乎绝对值得一试。 – jwyllie83

+0

啊,对不起,这是我没有完全读完它。 –