0

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

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
4

3 回答 3

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)
于 2012-08-15T13:01:52.723 回答
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'
于 2012-08-15T12:37:41.257 回答
0

该函数printStats实际上不是您的stat类的一部分,因为它使用选项卡式缩进,而类的其余部分使用空格缩进。尝试一下print dir(stat),您会发现它printStats不存在。要解决此问题,请更改标签样式,使其在整个班级中保持一致。

你还应该看看这一行:

str = line_str.split()

str您正在用自己的列表覆盖内置类型。结果,你不能再用str把东西转换成字符串了。当你调用成功时printStats,它会给你一个TypeErrorstr将变量的名称更改为其他名称。

于 2012-08-15T12:45:54.353 回答