2012-08-15 106 views
0

我有以下代码,我使用类stat来保存我的数据。将stat类型的对象插入到列表中。但是,当我尝试调用方法printStats时,出现错误AttributeError: stat instance has no attribute 'printStats'。其次,我想知道如何排序包含stat的对象的列表。我的排序应该基于blocks字段stat对包含python类中的对象的列表排序

fi = open('txt/stats.txt', 'r') 
fo = open('compile/stats.txt', 'w') 
list = [] 

class stat(): 
    def __init__(self, fname, blocks, backEdges): 
     self.fname = fname 
     self.blocks = blocks 
     self.backEdges = backEdges 
    def printStats(self): 
     print self.fname + str(self.blocks) + str(self.backEdges) 

while True: 
    line_str = fi.readline() 
    if line_str == '': 
     break 

    str = line_str.split() 
    list.append(stat(str[0], int(str[1]), int(str[2]))) 

for item in list: 
    item.printStats() # <-- problem calling this 
+1

不要使用'list'作为名字。 – 2012-08-15 12:39:05

+0

从'object'继承也是一个好习惯。例如'class stat(object):' – mgilson 2012-08-15 12:43:46

+0

另外,由于文件对象支持迭代,所以你可以不用'while true'循环,而只需要'for line_str in fi:'。 – mgilson 2012-08-15 12:45:03

回答

3

至于排序而言,你肯定可以使用key功能:

import operator 
lst.sort(key=lambda x: x.blocks) 
lst.sort(key=operator.attrgetter('blocks')) #alternative without lambda. 

不过,如果你希望能够在非排序方面比较stats对象,可以覆盖__eq____gt____lt__(,使您的生活更轻松,你可以使用functools.total_ordering类装饰定义最适合你的比较):

import functools 
@functools.total_ordering 
class stats(object): #inherit from object. It's a good idea 
    def __init__(self, fname, blocks, backEdges): 
     self.fname = fname 
     self.blocks = blocks 
     self.backEdges = backEdges 
    def printStats(self): 
     print self.fname + str(self.blocks) + str(self.backEdges) 
    def __eq__(self,other): 
     return self.blocks == other.blocks 
    def __lt__(self,other): 
     return self.blocks < other.blocks 

stats这种方式定义,分类应该再次简单:

lst.sort() #or if you want a new list: new_lst = sorted(lst) 
2
list.sort(key= lambda x:x.blocks) 

例如:

>>> a=stat('foo',20,30) 
>>> a.printStats() 
foo2030 
>>> b=stat('foo',15,25) 
>>> c=stat('foo',22,23) 
>>> lis=[a,b,c] 
>>> lis.sort(key= lambda x:x.blocks) 
>>> ' '.join(str(x.blocks) for x in lis) #sorted 
'15 20 22' 
+0

但是,为什么我会得到AttributeError:stat实例没有属性'printStats'错误 – pythonic 2012-08-15 12:45:06

0

功能printStats其实不是你的stat类的一部分,因为它使用标签缩进,而阶级的其余部分使用空间缩进。尝试print dir(stat),您会看到printStats不存在。要解决此问题,请更改Tab键风格,以便在整个课程中保持一致。

你也应该看看这个行:

str = line_str.split() 

要覆盖内建有自己的列表类型str。因此,您不能再使用str将东西转换为字符串。当你成功拨打printStats时,它会给你一个TypeError。将您的str变量的名称更改为其他名称。

+0

虽然你是对的, (OP *是*阴影'str',这应该导致在这个代码中的某一点的异常)我不明白这将导致OP描​​述的'AttributeError' ... – mgilson 2012-08-15 12:47:57

+0

是的,我跳枪a一点点,并发布修复,使它在_my_机器上工作。我猜OP的环境与我不同,因为我得到了一个不同的错误。 – Kevin 2012-08-15 12:52:20

+2

是的。我的猜测是这是一个混合标签和空格问题,或者我们上面看到的代码实际上并不是OP的代码。 – mgilson 2012-08-15 12:55:27

相关问题