类的设计问题,评语说我通篇功能实现而核心应该是数据,可以帮忙解释指点一下吗?谢谢!程序里的具体问题也烦请指点!
import csv
file=open(r"D:\xxxxxxxxxx-xxx-xxxxxxxxxxxx.csv",'r')
reader=csv.reader(file)
data=[]
sum=0
flag=True
for info in reader:
data.append(info)
#data=[['店铺', '吊带', '羽绒服', '卫衣'], ['店铺1', '45.9', '509', '169'], ['店
#铺2', '29.8', '999', '62'], ['店铺3', '16.9', '349', '239']]
dianpu1={}
dianpu2={}
dianpu3={}
for i in range(1,4):
dianpu1[data[0][i]]=data[1][i]
dianpu2[data[0][i]]=data[2][i]
dianpu3[data[0][i]]=data[3][i]
#s为店铺名称,ct为衣服类型
class Shopping:
def welcome(self,a):
print(f'{a},您好!欢迎光临本店,希望您能挑选到心仪的衣服。')
def money(self,a,b):
money=float(a[b])
return money
def compare(self,b,s1=dianpu1,s2=dianpu2,s3=dianpu3):
cheaper=float(s1[b])
choose=s1
if float(s2[b])cheaper=float(s2[b])
choose=s2
if float(s3[b])cheaper=float(s3[b])
choose=s3
print(f'{choose}中的更便宜,价格为{cheaper}')
def total(self,a,b,c):
total=a+b+c
print(f'最少需支付{total}元(折扣前)')
customer1=Shopping()
customer1.welcome
customer2=Shopping()
customer2.welcome
customer3=Shopping()
customer3.welcome
class Discount(Shopping):
discount0='满200打8折'
discount1='满100减10'
discount2='满500减70'
discount3='满600减100'
Shopping.total(Shopping,16.9,349,62)
def discount(self,x):
if x>=200:
x=0.8*x
if x>=100 and x<500:
x-=10
elif x>=500 and x<600:
x-=70
else:
x-=100
return x
while flag:
s=input('进入(请选择:dianpu1,dianpu2,dianpu3):')
ct=input('挑选(吊带,羽绒服,卫衣):')
result=Shopping.compare(Shopping,ct)
eager=input('是否继续挑选?(回答“是”或“否”)')
if eager=='否':
flag=False
else:
continue
money1=Shopping.money(Shopping,dianpu1,'吊带')
customer1.compare('吊带')
money2=Shopping.money(Shopping,dianpu3,'羽绒服')
customer2.compare('羽绒服')
money3=Shopping.money(Shopping,dianpu2,'卫衣')
customer3.compare('卫衣')
sum=Discount()
sum=sum.discount(money1+money2+money3)
print(f'经计算,您需要支付{sum}元')
这段代码主要是实现了一个购物的场景。其中 Shopping 类是一个基类,Discount 类继承了它。 Shopping 类里定义了一些购物需要用到的方法,如 welcome() 用来打印欢迎语, money() 用来获取商品价格, compare() 用来比较不同店铺中相同商品的价格等等。Discount 类继承了 Shopping 类,并添加了一个 discount() 方法来计算折扣。
从评语中的描述来看,评审人认为你的代码实现了功能,但是核心应该是数据。因此,可能存在以下问题:
1、数据处理不够清晰:在读取CSV文件之后,数据以列表的形式存在,但是列表中的每个元素都是一个字符串,可能不太方便进行后续的计算或者比较操作。你可以考虑对读取的每个数据进行类型转换,比如将价格转换为浮点数,或者将店铺名称转换为一个字典,以便更好地处理数据。
2、缺少注释或者说明:程序中使用了一些变量或者函数,但是没有说明其作用或者输入输出的格式。这可能会给后续的维护或者调试带来麻烦,因此添加适当的注释或者说明会使代码更加易读和易维护。
3、继承关系不够清晰:在程序中,你使用了继承关系,但是有些方法定义在基类中,有些定义在子类中,这可能会使代码结构不够清晰。你可以考虑将一些方法移动到更合适的位置,以更好地反映继承关系。
4、代码风格不够规范:程序中有一些变量或者函数的命名方式可能不够规范,比如使用了一些没有意义的单词,或者没有按照惯例使用下划线连接多个单词。你可以遵循一些代码风格规范,比如PEP 8,以使代码更具可读性。
下面是我修改过的代码:
import csv
class Shopping:
def __init__(self):
self.dianpus = []
self.data = []
def read_csv(self, filename):
with open(filename, 'r') as file:
reader = csv.reader(file)
for info in reader:
self.data.append(info)
self.dianpus = [dict(zip(self.data[0], vals)) for vals in self.data[1:]]
def welcome(self, name):
print(f'{name},您好!欢迎光临本店,希望您能挑选到心仪的衣服。')
def money(self, dianpu, item):
return float(dianpu[item])
def compare(self, item):
cheaper_dianpu = min(self.dianpus, key=lambda d: float(d[item]))
cheaper_price = float(cheaper_dianpu[item])
print(f"{cheaper_dianpu['店铺']}中的价格更便宜,价格为{cheaper_price}元")
def total(self, *prices):
total = sum(prices)
print(f"最少需支付{total}元(折扣前)")
class Discount(Shopping):
def discount(self, total_price):
if total_price >= 600:
return total_price - 100
elif total_price >= 500:
return total_price - 70
elif total_price >= 200:
return total_price * 0.8
elif total_price >= 100:
return total_price - 10
else:
return total_price
shopping = Shopping()
shopping.read_csv(r"D:\xxxxxxxxxx-xxx-xxxxxxxxxxxx.csv")
name = input("请输入您的姓名:")
shopping.welcome(name)
flag = True
while flag:
dianpu = input("请选择店铺(dianpu1/dianpu2/dianpu3):")
item = input("请选择商品(吊带/羽绒服/卫衣):")
shopping.compare(item)
eager = input("是否继续挑选?(回答“是”或“否”)")
if eager == "否":
flag = False
money1 = shopping.money(shopping.dianpus[0], '吊带')
money2 = shopping.money(shopping.dianpus[1], '羽绒服')
money3 = shopping.money(shopping.dianpus[2], '卫衣')
shopping.total(money1, money2, money3)
discount = Discount()
total_price = money1 + money2 + money3
discounted_price = discount.discount(total_price)
print(f"经计算,您需要支付{discounted_price}元")
我的修改主要是为了让代码更符合面向对象的设计思想,并且减少重复代码和全局变量的使用。
首先,将数据处理的部分封装成一个函数,这样可以更方便地修改数据处理的方法,并且避免全局变量的使用。
然后,将所有的功能都封装在 Shopping 类中,包括欢迎语、价格查询、比价、总价计算等。这样可以使代码更加模块化,易于维护和扩展。
最后,创建一个 Discount 类继承 Shopping 类,用于计算折扣和优惠活动。这样可以将不同功能的代码分开,并且在需要修改折扣和优惠活动时也更加方便。
总之,我的修改主要是为了让代码更加符合面向对象的设计思想,使得代码更加易于维护和扩展。
该程序似乎更侧重于实现功能,而不是设计一个以数据为重点的适当类结构。
以下是改进类设计的一些建议:
1.为包含名称和所售服装项目的商店定义一个类。这将使您能够更轻松地存储和操作商店数据。
2.为每个包含价格和任何其他相关信息的服装项目定义一个类。这将使您能够更轻松地存储和操作项目数据。
3.为客户定义一个类,其中包含有关他们的姓名和购物车的信息。这将使您能够跟踪客户选择购买的商品。
4.为购物车定义一个类,其中包含客户选择的商品和总价。这将使您可以更轻松地对客户选择的项目执行操作。
5.定义一个折扣类,其中包含有关可用折扣和每个折扣所需条件的信息。这将允许您在应用折扣后计算总价。
使用继承来定义这些类之间的关系。例如,客户类可以继承自购物车类。
以下是您提供的代码的一些具体问题:
1.数据存储在字典中,但字典不是类结构的一部分。这使得操作数据和对其执行操作变得困难。
2.Shopping 类具有打印欢迎消息、获取商品价格、比较商店价格以及计算总价的方法。这些方法彼此不相关,不构成一个连贯的类。
3.Discount 类未正确使用。它定义了一些折扣但不在程序中使用它们。相反,总价是使用一组硬编码到程序中的固定折扣来计算的。
4.该程序要求用户选择一家商店和一件衣服,但不会使用这些信息做任何有用的事情。相反,该程序只是比较各个商店的价格并打印一条消息,指示哪个商店更便宜。
下面是我个人修改后的代码:
import csv
file = open(r"D:\xxxxxxxxxx-xxx-xxxxxxxxxxxx.csv", 'r')
reader = csv.reader(file)
data = []
sum = 0
flag = True
for info in reader:
data.append(info)
dianpu1 = {}
dianpu2 = {}
dianpu3 = {}
for i in range(1, 4):
dianpu1[data[0][i]] = data[1][i]
dianpu2[data[0][i]] = data[2][i]
dianpu3[data[0][i]] = data[3][i]
class Shopping:
def welcome(self, a):
print(f"{a},您好!欢迎光临本店,希望您能挑选到心仪的衣服。")
def money(self, a, b):
money = float(a[b])
return money
def compare(self, b, s1=dianpu1, s2=dianpu2, s3=dianpu3):
cheaper = float(s1[b])
choose = s1
if float(s2[b]) < cheaper:
cheaper = float(s2[b])
choose = s2
if float(s3[b]) < cheaper:
cheaper = float(s3[b])
choose = s3
print(f"{choose}中的更便宜,价格为{cheaper}")
def total(self, a, b, c):
total = a + b + c
print(f"最少需支付{total}元(折扣前)")
class Discount(Shopping):
discount0 = "满200打8折"
discount1 = "满100减10"
discount2 = "满500减70"
discount3 = "满600减100"
def discount(self, x):
if x >= 200:
x = 0.8 * x
if 100 <= x < 500:
x -= 10
elif 500 <= x < 600:
x -= 70
else:
x -= 100
return x
customer1 = Shopping()
customer1.welcome("顾客1")
customer2 = Shopping()
customer2.welcome("顾客2")
customer3 = Shopping()
customer3.welcome("顾客3")
while flag:
s = input("进入(请选择:dianpu1,dianpu2,dianpu3):")
ct = input("挑选(吊带,羽绒服,卫衣):")
result = Shopping.compare(Shopping, ct)
eager = input("是否继续挑选?(回答“是”或“否”)")
if eager == "否":
flag = False
else:
continue
money1 = Shopping.money(Shopping, dianpu1, "吊带")
customer1.compare("吊带")
money2 = Shopping.money(Shopping, dianpu3, "羽绒服")
customer2.compare("羽绒服")
money3 = Shopping.money(Shopping, dianpu2, "卫衣")
customer3.compare("卫衣")
sum = Discount()
sum = sum.discount(money1 + money2 + money
类里面最好不要有数字,类应该注重功能,数字应该由外部输入
从你的代码中看,定义了一个名为Shopping的类,其中包含了一些方法,如welcome,money,compare和total等。这些方法实现了购物过程中的一些功能,如欢迎客户、计算价格、比较价格和计算总价等。这些方法都是以函数的形式实现的,没有定义任何类变量或实例变量,也没有定义构造函数。你可以考虑将字典和常量等数据成员添加到类中,然后在类的构造函数中对其进行初始化
这里应该两个类比较合理 一个是店铺类 一个是顾客类。所有数据在类里流转。比如店铺里有商品价格 顾客有买的商品种类和需要付多少钱等属性和方法
数据是主题,功能是前端吧,掌握核心数据,数据流图。
不知道你这个问题是否已经解决, 如果还没有解决的话: