xueji_huakai 2023-02-18 15:03 采纳率: 100%
浏览 65
已结题

关于类的设计,想请教一下

类的设计问题,评语说我通篇功能实现而核心应该是数据,可以帮忙解释指点一下吗?谢谢!程序里的具体问题也烦请指点!

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:
            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}元(折扣前)')
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}元')

  • 写回答

7条回答 默认 最新

  • zzwwtyyds 2023-02-18 19:26
    关注

    这段代码主要是实现了一个购物的场景。其中 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 类,用于计算折扣和优惠活动。这样可以将不同功能的代码分开,并且在需要修改折扣和优惠活动时也更加方便。

    总之,我的修改主要是为了让代码更加符合面向对象的设计思想,使得代码更加易于维护和扩展。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 2月26日
  • 已采纳回答 2月18日
  • 创建了问题 2月18日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效