如何将User_interaction类的变量传递给DataBase_Management类?
实现用户交互输入到数据库添加方法的参数传递
要把User_interaction类中add_item_interaction获取的用户输入,传给DataBase_Management的add_item方法,按以下步骤修改即可:
步骤1:修复User_interaction类的内部问题
原代码存在几个小错误,先修正:
enter_data是类的实例方法,必须添加self作为第一个参数add_item_interaction里的变量名要统一(self.add_name改为self.add_item_name),空值判断的变量也要对应- 在
ask_options的选项1分支里,调用self.add_item_interaction()触发输入流程
修正后的User_interaction类代码:
class User_interaction(object): # 类名采用大驼峰规范 def __init__(self): self.name = self.ask() self.options = self.ask_options() self.add_item_num = None self.add_item_price = None self.add_item_quant = None self.add_item_name = None def ask(self): while True: name = input("What is your name?\n") if name == "": print("Ha! You have to enter a name!") else: print("Welcome to the Shepherdstown Bake Shop " + name) return name def ask_options(self): while True: option = input('''What would you like to do? \n1. Add a Item: \n2. Delete a Item:\n3. Edit an Item: \n4. View Inventory \n5. End Program\n''') if option == '1': print("Welcome to the adding process " + self.name) self.add_item_interaction() # 调用输入方法 break # 其他选项可后续补充逻辑 def enter_data(self, message, typ): # 添加self参数 while True: try: v = typ(input(message)) except ValueError: print(f"That's not an {typ.__name__}!") # 用__name__输出类型名称更友好 continue else: break return v def add_item_interaction(self): self.add_item_num = self.enter_data("What is the items #?\n", int) # 调用实例方法要加self self.add_item_price = self.enter_data("What is the items price?\n", float) self.add_item_quant = self.enter_data("What is the items quantity?\n", int) while True: self.add_item_name = self.enter_data("What is the items name?\n", str) if self.add_item_name == "": # 修正变量名 print("Ha! You have to enter a name!") continue break
步骤2:修改DataBase_Management的add_item方法,接收外部参数
让add_item方法接收item_num、price、quant、name四个参数,直接用于构建新行:
修正后的DataBase_Management类代码:
import csv # 记得导入csv模块 class DataBase_Management(object): def __init__(self): self.result = [] self.make_dict_items() # 初始化时加载现有数据 def make_dict_items(self): with open("Items2.csv") as fp: reader = csv.reader(fp) labels = next(reader, None) for row in reader: if row: row[0] = int(row[0]) row[1] = float(row[1]) row[2] = int(row[2]) pairs = zip(labels, row) self.result.append(dict(pairs)) def add_item(self, item_num, price, quant, name): # 添加参数 new_row = [item_num, price, quant, name] with open("Items2.csv", "a+", newline='') as fp: # 添加newline=''避免空行 reader = csv.reader(fp) fp.seek(0) labels = next(reader, None) writer = csv.writer(fp) new_record = dict(zip(labels, new_row)) self.result.append(new_record) writer.writerow(new_record.values()) print("Item Added! Check Inventory Again to see!")
步骤3:主逻辑中完成参数传递
实例化两个类,在用户选择添加选项后,把User_interaction实例的属性传给DataBase_Management的add_item方法:
if __name__ == "__main__": ui = User_interaction() db = DataBase_Management() # 当用户选择添加选项后,传递参数 if ui.options == '1': db.add_item(ui.add_item_num, ui.add_item_price, ui.add_item_quant, ui.add_item_name)
关键说明
- 通过实例属性传递:
User_interaction实例把输入值存在自身属性中,外部可直接访问这些属性 - 方法参数接收:
DataBase_Management的add_item通过参数接收外部传入的值,实现类之间的解耦,避免直接依赖对方的内部结构
内容的提问来源于stack exchange,提问作者py_coder1019
相关产品推荐
相关产品推荐

