【发布时间】:2019-10-07 14:35:40
【问题描述】:
我有一个类,其中包含几个列表作为属性和几个添加方法,用于根据对象的类型将对象附加到特定列表。
我的代码读取了一个包含对象类型的 csv 文件,以便创建它并将其添加到我的购物车中。
我的问题是我正在测试对象类型以使用 if elif 语法调用正确的“添加”函数,但这不是很好且难以维护。
例如
import csv
class my_item():
def __init__(self, name):
self.name = name
class fruit(my_item):
pass
class vegetable(my_item):
pass
class meat(my_item):
pass
class fish(my_item):
pass
class shopping_cart():
def __init__(self):
self.fruits = []
self.vegetables = []
self.meat = []
self.fish = []
def add_fruit(self, o):
self.fruits.append(o)
def add_vegetable(self, o):
self.vegetables.append(o)
def add_meat(self, o):
self.meat.append(o)
def add_fish(self, o):
self.fish.append(o)
def __str__(self):
msg = ""
msg += "{:<25}= {:<5}\n".format('Total', str(len(self.fruits) + len(self.vegetables) + len(self.meat) + len(self.fish)))
for attrname in vars(self):
value = getattr(self, attrname)
if isinstance(value, list):
msg += " {:<23}= {:<5}\n".format(attrname, len(value))
return msg
def main():
input_f = 'input.csv'
my_cart = shopping_cart()
with open(input_f, 'r') as i:
rows = csv.reader(i, delimiter=';')
for row in rows:
item = globals()[row[0]](row[1])
if item.__class__.__name__ == 'fruit':
my_cart.add_fruit(item)
elif item.__class__.__name__ == 'vegetable':
my_cart.add_vegetable(item)
elif item.__class__.__name__ == 'meat':
my_cart.add_meat(item)
else:
my_cart.add_fish(item)
print (my_cart)
if __name__ == '__main__':
main()
您是否看到if elif 块的替代方案?
感谢您的反馈。
【问题讨论】:
-
您能补充一下您的
input.csv的样子吗? -
你可以做一个访问者样式:
item.addTo(my_cart),其中项目知道要调用add_fruit(), add_meat()等中的哪个。 -
您的代码可能与更简单的类设计有关,请在@Simon 下方查看我的答案
-
输入的 .csv 看起来像这个水果;pomme 肉;dinde 蔬菜;carotte fish;saumon
标签: python methods dynamic call