我有一个Team
类和一个Driver
类
class Team:
def __init__(self, teamName, drivers=None):
self.teamName = teamName
if drivers is not None:
self.drivers = list(drivers)
else:
self.drivers = []
class Driver:
def __init__(self, name, country, number: str, podiums: int):
self.name = name
self.country = country
self.number = number
self.podiums = podiums
Team
类还有一个函数,用于向特定团队添加Driver
类的实例。
每个车队有两名车手,车手可以交换车队。
我可以访问属于某个团队的驱动程序,但如何访问某个驱动程序所属的团队,而不必在Driver
类中手动添加team
参数
有很多方法可以解决这样的问题。许多代表着简单性(也许还有效率)和方便性(或“魔力”)之间的折衷。有时候,直截了当、直截了当确实是最好的,即使它看起来很笨拙
也就是说。。。实现这一点的一种方法是给
Team
一个class属性,它是一个字典,列出所有team
实例及其关联的driver
实例。我从你的问题推断,一个车手一次只能在一个车队,如果可能的话,你希望尽可能“自动”地执行。我不确定您是否希望代码强制执行“每个团队不超过两个驱动程序”,如果您尝试添加第三个驱动程序,可能会抛出一个错误,因此我暂时不考虑这一方面我们需要实现
add_driver()
方法。它将检查驾驶员当前是否在其他团队,如果是,则将其删除:find_team_for_driver()
不是附加到特定实例,而是用于Team
类的常规簿记的方法,因此它是class method:我们可以使用property decorator来轻松查看团队的驱动因素:
这意味着我们仍然可以使用
team.drivers
的简单语法,Team
类的内部将处理从_membership
字典中获取它。请注意,虽然您可能会认为您可以将驱动程序添加到具有team.drivers.append(new_driver)
的团队中,但他们不知道如何从以前的团队中删除驱动程序(如果有的话)。请确保改用team.add_driver(new_driver)
(注意
team.drivers.remove(driver_to_remove)
确实可以工作,但是如果需要,我们可以定义一个remove_driver()
方法,以保持一致。)好的,我们终于到了
Driver
类,它变化很小。(我删除了除name
之外的所有属性,只是为了使示例代码更简单一些。)我们可以使用属性来找出驱动程序所在的团队,并将其重新分配给新团队:测试它:
重新分配驱动程序:
对于一定规模和复杂程度的项目,这种基础设施非常方便。对于更小、更简单的事情,您最好明确定义和设置对象之间的链接。(请注意,通过
Team._membership
进行的所有迭代都比引用显式对象属性慢。在许多情况下,这可能不够重要。)另一方面,随着项目变得越来越复杂,像Django这样的现有系统开始变得更有意义,而不是实现越来越多的这类东西。Django的总体目标是成为一个web框架,但即使您没有做任何与web相关的事情,它的对象关系系统也实现了各种关系(一对一、一对多、多对多),具有许多方便的选项,如双向性和唯一性的实施。如果您想尝试一下,请参见此question。(我相信SQLAlchemy实现了类似的功能,但我自己还没有尝试过。)
每当创建团队实例时,将每个驱动程序的团队属性设置为相应的“团队”实例。另外,将
team = None
添加到驱动程序类中编辑
正如@crazychunk所指出的,驱动程序对象也可以单独添加到驱动程序列表中,并且需要进行处理。因此,我提出了一个不同的解决方案
因此,即使将新的驱动程序添加到团队中,drivers类也将处理团队属性的设置
相关问题 更多 >
编程相关推荐