2012-08-15 141 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

相關問題