Python代码中Franchise类与Menu类的关联机制问询
请解释以下Python代码中Franchise类与Menu类的关联逻辑:既然Menu是类,menus是Franchise类的属性,代码是如何确立Franchise类的menus属性用于存储Menu类实例这一关系的?我原本预期会有明确连接两个类的代码行。
class Menu: def __init__(self, name, items, start_time, end_time): self.name = name self.items = items self.start_time = start_time self.end_time = end_time def __repr__(self): representative_string = "{name} available from {start_time} to {end_time}" return representative_string.format(name=self.name, start_time=self.start_time, end_time=self.end_time) def calculate_bill(self, purchased_items): total_price = 0 for item in purchased_items: total_price += self.items[item] return total_price brunch = Menu('brunch', {'pancakes': 7.50, 'waffles': 9.00, 'burger': 11.00, 'home fries': 4.50, 'coffee': 1.50, 'espresso': 3.00, 'tea': 1.00, 'mimosa': 10.50, 'orange juice': 3.50}, 11.00, 16.00) early_bird = Menu('early_bird', {'salumeria plate': 8.00, 'salad and breadsticks(serves 2, no refills)': 14.00, 'pizza with quattro formaggi': 9.00, 'duck rugu': 17.50, 'mushroom ravioli (vegan)': 13.50, 'coffee': 1.50, 'espresso': 3.00}, 15.00, 18.00) dinner = Menu('dinner', {'crostini with eggplant caponata': 13.00, 'caesar salad': 16.00, 'pizza with quattro formaggi': 11.00, 'duck ragu': 19.50, 'mushroom ravioli (vegan)': 13.50, 'coffee': 2.00, 'espresso': 3.00}, 17.00, 23.00) kids = Menu('kids', {'chicken nuggets': 6.50, 'fusilli with wild mushrooms': 12.00, 'apple juice': 3.00}, 11.00, 21.00) print(brunch) breakfast_order = ['pancakes', 'home fries', 'coffee'] total_price = brunch.calculate_bill(breakfast_order) print('Total price for breakfast:', total_price) last_order = ['salumeria plate', 'mushroom ravioli (vegan)'] total_price = early_bird.calculate_bill(last_order) print('Total price for last order:', total_price) class Franchise(): def __init__(self, address, menus): self.address = address self.menus = menus def __repr__(self): return f"{self.address}" def available_menus(self, time): available_orders = [] for menu in self.menus: if (time >= menu.start_time and time <= menu.end_time): available_orders.append(menu.name) return available_orders flagship_store = Franchise("1232 West End Road", [brunch, early_bird, dinner, kids]) new_installment = Franchise("12 East Mulberry Street", [brunch, early_bird, dinner, kids]) available_menus = flagship_store.available_menus(12.00) print('Available menus at 12.00 PM:', available_menus)
关联逻辑的核心要点
Python是动态类型语言,不需要像静态语言(如Java、C#)那样显式声明属性类型,两个类的关联通过运行时赋值和业务逻辑依赖确立,具体分为三步:
属性定义提供存储容器
Franchise类的__init__方法接收menus参数并赋值给self.menus,这只是定义了一个可存储任意数据的属性,此时尚未与Menu类绑定。实例化时传入Menu实例完成绑定
创建flagship_store和new_installment这两个Franchise实例时,第二个参数传入的是[brunch, early_bird, dinner, kids]——这些都是通过Menu()创建的Menu类实例。这一步直接将Menu实例集合赋值给Franchise的menus属性,完成了两个类的关联。业务逻辑强化关联约束
Franchise类的available_menus方法中,遍历self.menus并访问元素的start_time、end_time、name属性——这些都是Menu类独有的属性。如果self.menus存储的不是Menu实例,运行时会抛出AttributeError错误。这部分代码从逻辑层面强制要求menus属性必须存储Menu实例,进一步强化了两者的关联关系。
你预期的“明确连接代码行”常见于静态语言,但Python的动态特性决定了这种关联是通过实际传入的实例和使用属性的逻辑隐式确立的,不需要额外的声明语句。
内容的提问来源于stack exchange,提问作者Joseph Matheri

