设置属于类

时间:2016-11-20 12:31:29

标签: python class oop

您将如何设置以下类结构?为什么?

Class Person代表一个人 教室代表一个房间

我想存储一个人的房间位置,能够有效地提出以下两个问题:

1)X人在哪个房间?和, 2)哪些人在Y室?

我能看到的选项是:

  • Class Person存储Room位置(问题2效率低下),
  • Class Room存储其人员(问题1效率低下),
  • 以上两者(数据完整性问题的机会)和
  • 外部字典保存数据(似乎违背了OOP的精神)

3 个答案:

答案 0 :(得分:2)

  

外部字典保存数据(似乎违背了OOP的精神)

或许你可以一次实现所有方法:你定义两个关联人有一个房间房间有很多人,你也可以使用适当的数据索引所有内容以光速访问对象的结构!

也就是说,您可以使用面向对象的关联(即组合)遍历对象图,并实现一些特定的要求,将图形存储在某些数据结构中以满足您的要求。

这不违反OOP的精神。它支持良好的编码实践,而不是人工教条。

答案 1 :(得分:2)

并非每个问题都适合OOP。这是其中之一。 : - )

这里你基本上有一个二维网格或矩阵。 一个轴代表人,另一个代表房间。限制是一个人只能在一个房间里。

listperson)元组的room似乎是在Python中表示这一点的好方法。这是一个示例(在IPython中),带有两个查询:

In [1]: locations = [('alfred', 'office'), ('ben', 'storage'), ('charlene', 'office'), ('deborah', 'factory')]

In [2]: [room for person, room in locations if person == 'charlene']
Out[2]: ['office']

In [3]: [person for person, room in locations if room == 'office']
Out[3]: ['alfred', 'charlene']

查询是列表推导,所以它们非常快。 除非您的位置列表巨大,否则我认为性能不会是一个大问题。

请注意,此解决方案适用于空房间和不在场的人。

In [4]: [room for person, room in locations if person == 'zeke']
Out[4]: []

In [5]: [person for person, room in locations if room == 'maintenance']
Out[5]: []

您必须注意不要两次插入同一个人。

答案 2 :(得分:1)

绝对是外部结构。这就是OOP的精神。类表示对象。一个人既不是房间的财产,也不是一个人的财产,所以没有理由把一个人放在另一个人的课堂上。相反,字典表示它们之间的关系,因此它应该是一个新实体。

简单格式是字典,其中每个键都是一个房间,值是其中的人员列表。但是,如果您需要更复杂的功能,可以在它周围创建一个类