2013-09-22 43 views
1

我與「對象」,我會用我的小腳本的有限列表的工作:何時使用課程以及何時使用字典?

books = [ 
    {'name': 'Book1': 'id', '123', 'text', '.....'}, 
    {'name': 'Book2': 'id', '123', 'text', '.....'}, 
    {'name': 'Book3': 'id', '123', 'text', '.....'}, 
] 

是否有意義創建這本書類型的類,或者是罰款的方式,是什麼?

創建一個類的問題是將會有更多的鍋爐板。

+0

你這樣做是因爲你想添加功能的書類,或者你只是想存儲數據? –

+0

@GamesBrainiac,只是存儲數據。 – TheOne

回答

0

如果你不打算使用方法,你應該很好。否則,我會建議使用一個類。

2

你現在的代碼使它完全理解它的方式。而且它在運行時速度要快得多,因爲Python實例化非內置對象的速度有點慢。如果你想要高性能,那麼儘可能避免在Python中實例化類。但是,您付出代價的代價有點難以理解。

你甚至可以創建一個函數,將條目添加到書籍列表中。如果你有一堂課,那就相當於你的「構造函數」。

4

既然你簡單的想存儲數據,我會建議你使用命名的元組。這是如何使用named tuples的一個很好的例子。

理想情況下,您可以簡單循環遍歷書籍列表,然後獲取每個列表的值,然後將它們放入一個命名的元組中。那麼可以簡單地訪問他們像這樣:

some_book.name 

這裏,是一個簡單的例子:

>>> from collections import namedtuple 
>>> NetworkAddress = namedtuple('NetworkAddress',['hostname','port']) 
>>> a = NetworkAddress('www.python.org',80) 
>>> a.hostname 
'www.python.org' 
>>> a.port 
80 
>>> host, port = a 
>>> len(a) 
2 
>>> type(a) 
<class '_ _main_ _.NetworkAddress'> 
>>> isinstance(a, tuple) 
True 
>>> 

這將使你的書訪問數據簡單了很多,同時幫助您確保本書所需的所有數據都存在。

+0

使用namedtuple的一個缺點是它是不可變的。 – TheOne

+0

@Ramin是的,但與創建整個對象相比,它們花費的開銷要少很多。 –

2

如果你已經許多「啞巴」的對象只有成員,沒有方法,那麼這種模式可能是有用的:

class Obj(object): 
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

那些三線後,你可以用字段創建對象,你

需要簡單地
books = [ 
    Obj(name='Book1', id='123', text='.....'), 
    Obj(name='Book2', id='124', text='.....'), 
    Obj(name='Book3', id='125', text='.....'), 
    Obj(name='Book4', id='126', text='.....') 
] 

,您可以用

for b in books: 
    print b.id, b.name 

這種做法將在以後使用它們允許您使用相同的更易讀的語法來編寫程序的代碼,無論如何,如果將來您需要使用方法更新到完整的特定類。

+0

很好的答案,但它看起來像一個namedtuple需要較少的樣板 - 可能有一點靈活性。 – TheOne

+0

@Ramin:當你想要使用它的主要特徵時,namedtuple是非常棒的...即,這些實例也是元組。然而,命名的定義是明確的,並且在變化中你得到一個類型。這更「動態」,所有這些對象都只是「對象」(沒有特定類型),其中每個實例可以有不同的成員(一個Javascript)。這可能是好的或噩夢,取決於你需要做什麼。 – 6502

相關問題