2013-09-22 21 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

相关问题