Python,名为tuple,扩展到制作一个基本的零件库存系统



我一直在为一个简单的库存系统使用这个基本代码。我需要扩展它来跟踪另一个离开库存的零件列表。我想我可以通过为数据结构创建另一个命名元组来实现这一点。我遇到了一些问题,因为这两个命名的元组需要同时存在和访问。我如何在python中做到这一点?

import sys
from collections import namedtuple

class Part(namedtuple("Part", "name part_number quantity")):
def __str__(self):
return ", ".join(self)

class Parts(dict):
def display (self):
if not self:
print('No Parts Found in List')
return
print()
print('Name, Part Number, Quantity')
for part in self.values():
print(part)
print()
def add(self, *args):
try:
name, part_number, quantity = args
except ValueError:
name = input("Enter Name of Part:n ")
part_number = input("Enter Part Number:n ")
quantity = input("Enter Quantity:n ")
self[name] = Part(name, part_number, quantity)
def remove(self, part=""):
if not part:
part = input("Enter Part Name to Removen")
try:
del self[part]
except Keyerror:
print("Part {} not found.".format(part))
def edit(self, part=""):
if not part:
part = input("Enter Part Name to Editn")
try:
new_name = input("Enter new part namen")
number = input("Enter new part numbern ")
quantity = input("Enter new quantityn ")
self[part] = Part(new_name, number, quantity)
except KeyError:
print("No such Part exists: {}".format(part))
def save(self, filename=""):
if not filename:
filename = input("Filename to save: ")
with open(filename, "wt") as out_file:
for part in self.values():
out_file.write("{}n".format(part))
print("File saved")
def load(self, filename=""):
if not filename:
filename = input("Filename to load: ")
try:
with open(filename, "rt") as in_file:
for line in in_file:
if not line:
break
part, part_number, quantity = line.strip().split(",")
self.add(part, part_number, quantity)
except FileNotFoundError:
print("File Not Found.")

def menu(inventory):
menu_list = [("Parts", inventory.display),
("Add Part", inventory.add),
("Remove Part", inventory.remove),
("Edit Part", inventory.edit),
("Save Part List", inventory.save),
("Load Part List", inventory.load),
("Exit", sys.exit)]
while True:
for i, (name, _) in enumerate(menu_list, 1):
print("{}. {}".format(i, name))
try:
user = int(input("Selection> "))
menu_list[user-1][1]()
except (ValueError, IndexError):
print("Selection Not Valid.")
def main():
print("Welcome to Sticks&Stones Inventory System")
inventory = Parts()
while True:
menu(inventory)
if __name__ == '__main__':
try:
main()
except (KeyboardInterrupt, SystemExit):
print("Exiting Program...")`enter code here

`

您的两个元组(或多个)可以同时存在并被访问,没有问题!

class Parts(namedtuple("Parts", "name part_number quantity")):
def __str__(self):
return ", ".join(self)
class RemovedParts(namedtuple("RemovedParts", "name quantity")):
pass
# etc.

话虽如此,让我提出一些建议:

  1. As@juanpa.arrivilaga已经建议,您当前的Parts类不应该扩展dict。问问自己,";我的系统字典是因为它便于实现,还是是因为一些基本属性我的系统是字典">

    我想你会看到,在这种情况下,has-a/is-a问题是一个很好的方法,可以看出你应该在设计中使用组合(has-a)而不是继承(is-a)。

  2. 考虑将Parts类重命名为其他类。你正在建模的实际上是一个包含关于零件的信息以及你手头有多少零件的东西。也许PartsInfo甚至Inventory会是一个更好的类名。

  3. 考虑将实际的管理对象与用户界面分离。也许您有Inventory对象和InventoryUI对象?将几乎所有与用户交互的函数都移动到UI类中。

  4. 编写一些辅助函数(方法)来执行读取零件号或零件名称等操作,并确认它们是有效的。也许你需要一对字典,其中一本是零件号->部件信息和另一个用于部件名称->零件信息?

  5. 考虑使用json库序列化数据以进行加载/保存操作。

最新更新