繁体   English   中英

如何通过python中的属性访问特定的类实例?

[英]How to access a specific class instance by attribute in python?

假设我有一个具有两个属性的类Box,它们是self.contents和self.number。 我在名为“框”的列表中有框的实例。 是否有通过属性访问/修改特定实例的方法,而不是通过Box进行迭代? 例如,如果我想要一个box.number = 40的框(并且列表未排序),那么修改其内容的最佳方法是什么。

如果您需要更频繁地执行此操作并且您拥有唯一的number s,那么可以创建一个字典:

numberedBox = dict((b.number, b) for b in Boxes)

然后,您可以直接使用数字访问框:

numberedBox[40]

但是如果您想更改其编号,则也必须修改numberedBox词典...

否则,您必须遍历该列表。

最直接的方法是使用列表理解:

answer=[box for box in boxes if box.number==40]

但是被警告。 实际上,这确实会遍历整个list 由于list没有排序,除非您想将所有数据复制到其他数据结构(例如dictset或sort list )中,否则没有比迭代它更快的方法(因此可以进行线性搜索)。

使用内置的过滤器:

wanted_boxes = filter(lambda box: box.number == 40, boxes)

虽然不够灵活使用字典,您可能能够通过使用简单的查找表的映射盒号码在一个特定的盒子拿到boxes 例如,如果您知道框号的范围是0...MAX_BOX_NUMBER ,那么以下操作将非常快。 只需对“ Boxes列表进行一次完整扫描即可设置该表。

MAX_BOX_NUMBER = ...

# setup lookup table   
box_number = [None for i in xrange(MAX_BOX_NUMBER+1)]
for i in xrange(len(Boxes)):
    box_number[Boxes[i].number] = Boxes[i]

box_number[42] # box in Boxes with given number (or None)

如果框号在其他任意范围内,则在将它们用作索引之前,必须对其应用一些较小的运算。 如果范围很大,但人烟稀少,那么字典将是节省内存的方法,但需要更多的计算,这是通常的折衷方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM