鱼C论坛

 找回密码
 立即注册
查看: 479|回复: 4

[已解决]代码求助

[复制链接]
发表于 2025-2-21 13:40:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Car_General:
    def __init__(self,carid,brand,model,platenum,dayrent):
        self.brand=brand
        self.model=model
        self.platenum=platenum
        self.dayrent=dayrent
        self.carid=carid
    def get_brand(self):
        return self.brand
    def get_model(self):
        return self.model
    def get_platenum(self):
        return self.platenum
    def get_dayrent(self):
        return self.dayrent
    def get_carid(self):
        return self.carid
    def calc_rent(self,day,adiscount=1):
        self.day=day
        self.adiscount=adiscount
        self.rent=self.day*(self.dayrent-self.bonus+self.insurance+self.loss)*self.adiscount
   
class EconomyCar(Car_General):
    def __init__(self,bonus):
        super.__init__(carid,brand,model,platenum,dayrent)
        self.bonus=bonus
class LuxuryCar(Car_General):
    def __init__(self,insurance):
        super.__init__(carid,brand,model,platenum,dayrent)
        self.insurance=insurance
class SportsCar(Car_General):
    def __init__(self,loss):
        super.__init__(carid,brand,model,platenum,dayrent)
        self.loss=loss
class SUV(Car_General):
    def __init__(self,adiscount):
        super.__init__(carid,brand,model,platenum,dayrent)
        self.adiscount=adiscount
class CarOperation():
    cars={}
    stocks={'EconomyCar':[],'LuxuryCar':[],'SportsCar':[],'SUV':[]}
    carid1=10000
    carid2=20000
    carid3=30000
    carid4=40000
    def operate(self):
        print('欢迎使用鱼C汽车租赁程序\n')
        while True:
            op=int(input('1.录入汽车;2.租车服务;3.还车服务;4.退出程序:\n'))
            if op == 1:
                self.register()
            if op == 2:
                self.rent_car()
            if op == 3:
                self.return_car()
            if op == 4:
                break
    def register(self):
        sort_=int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
        num=int(input('请输入需要录入的数量:'))
        for i in range(num):
            print(f'请录入第{i+1}辆车\n')
            brand=input('品牌:')
            model=input('型号:')
            platenum=input('车牌:')
            dayrent=int(input('租金:'))

            if sort_ ==1:
                bonus=int(input('补贴:'))
                carid=self.carid1
                self.carid1+=1
                c=Car_General(carid,brand,model,platenum,dayrent,bonus)
            if sort_ ==2:
                insurance=int(input('保险:'))
                carid=self.carid2
                self.carid2+=1
                c=Car_General(carid,brand,model,platenum,dayrent,insurance)
            if sort_ ==3:
                loss=int(input('损耗:'))
                carid=self.carid3
                self.carid3+=1
                c=Car_General(carid,brand,model,platenum,dayrent,loss)
            if sort_ ==4:
                carid=self.carid4
                self.carid4+=1
                if day>7:
                    adiscount=0.7
                else:
                    adiscount=1
                c=Car_General(carid,brand,model,platenum,dayrent,adiscount)
            self.cars[carid]=c
            if sort_ ==1:
                self.stocks['EconomyCar'].append(c)
            if sort_ ==2:
                self.stocks['LuxuryCar'].append(c)
            if sort_ ==3:
                self.stocks['SportsCar'].append(c)
            if sort_ ==4:
                self.stocks['SUV'].append(c)
    def rent_car(self):
        print(f'1.经济车型(享有补贴),共有{len(self.stocks["EconomyCar"])}辆。\n')
        if self.stocks['EconomyCar']:
            for each in self.stocks['EconomyCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}-{each.bonus}(补贴)元\n')
        print(f'2.豪华车型(需额外购买保险),共有{len(self.stocks["LuxuryCar"])}辆。\n')
        if self.stocks['LuxuryCar']:
            for each in self.stocks['LuxuryCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.insurance}(保险)元\n')
        print(f'3.跑车(需增加损耗费用),共有{len(self.stocks["SportsCar"])}辆。\n')
        if self.stocks['SportsCar']:
            for each in self.stocks['SportsCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.loss}(损耗)元\n')
                print(f'4.SUV(租赁超过7天,享有额外折上7折优惠),共有{len(self.stocks["SUV"])}辆。\n')
        if self.stocks['SUV']:
            for each in self.stocks['SUV']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}元\n')

        idins=int(input('请输入需要租赁的车辆编号:'))
        day=int(input('请输入需要租赁的天数:'))
        total=cars[idins].calc_rent(day)
        if idins.starswith('1'):
            self.stocks['EconomyCar'].remove(cars[idins])
        if idins.startswith('2'):
            self.stocks['LuxuryCar'].remove(cars[idins])
        if idins.startswith('3'):
            self.stocks['SportsCar'].remove(cars[idins])   
        if idins.startswith('4'):
            if day>7:
                total=total*0.7
                self.stocks['SUV'].remove(cars[idins])
            else:
                self.stocks['SUV'].remove(cars[idins])
        print(f'租赁{day}天,总共需要花费:{total}元')
        print('恭喜,租赁成功~')   
    def return_car(self):
        idins=int(input('请输入车辆编号:'))
        if idins.starswith('1'):
            self.stocks['EconomyCar'].append(cars[idins])
        if idins.startswith('2'):
            self.stocks['LuxuryCar'].append(cars[idins])
        if idins.startswith('3'):
            self.stocks['SportsCar'].append(cars[idins])   
        if idins.startswith('4'):
            self.stocks['SUV'].append(cars[idins])
        
以上代码运行之后,报出如下错误:
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    main.operate()
  File "F:\python\小甲鱼\064 类和对象七\064 动动手 - 2.0.py", line 51, in operate
    self.register()
  File "F:\python\小甲鱼\064 类和对象七\064 动动手 - 2.0.py", line 72, in register
    c=Car_General(carid,brand,model,platenum,dayrent,bonus)
TypeError: Car_General.__init__() takes 6 positional arguments but 7 were given
原因为何以及如何修改
最佳答案
2025-2-22 08:18:26
本帖最后由 sfqxx 于 2025-2-22 08:21 编辑

错误的原因在于 Car_General 类的 __init__ 方法只接受 5 个参数(self、carid、brand、model、platenum、dayrent),但在 register 方法中,你尝试传递了额外的参数(如 bonus、insurance、loss 等),导致参数数量不匹配。

try this:
  1. class Car_General:
  2.     def __init__(self, carid, brand, model, platenum, dayrent, bonus=0, insurance=0, loss=0, adiscount=1):
  3.         self.brand = brand
  4.         self.model = model
  5.         self.platenum = platenum
  6.         self.dayrent = dayrent
  7.         self.carid = carid
  8.         self.bonus = bonus
  9.         self.insurance = insurance
  10.         self.loss = loss
  11.         self.adiscount = adiscount

  12.     def get_brand(self):
  13.         return self.brand

  14.     def get_model(self):
  15.         return self.model

  16.     def get_platenum(self):
  17.         return self.platenum

  18.     def get_dayrent(self):
  19.         return self.dayrent

  20.     def get_carid(self):
  21.         return self.carid

  22.     def calc_rent(self, day, adiscount=1):
  23.         self.day = day
  24.         self.adiscount = adiscount
  25.         self.rent = self.day * (self.dayrent - self.bonus + self.insurance + self.loss) * self.adiscount
  26.         return self.rent

  27. class EconomyCar(Car_General):
  28.     def __init__(self, carid, brand, model, platenum, dayrent, bonus):
  29.         super().__init__(carid, brand, model, platenum, dayrent, bonus=bonus)

  30. class LuxuryCar(Car_General):
  31.     def __init__(self, carid, brand, model, platenum, dayrent, insurance):
  32.         super().__init__(carid, brand, model, platenum, dayrent, insurance=insurance)

  33. class SportsCar(Car_General):
  34.     def __init__(self, carid, brand, model, platenum, dayrent, loss):
  35.         super().__init__(carid, brand, model, platenum, dayrent, loss=loss)

  36. class SUV(Car_General):
  37.     def __init__(self, carid, brand, model, platenum, dayrent, adiscount=1):
  38.         super().__init__(carid, brand, model, platenum, dayrent, adiscount=adiscount)

  39. class CarOperation:
  40.     cars = {}
  41.     stocks = {'EconomyCar': [], 'LuxuryCar': [], 'SportsCar': [], 'SUV': []}
  42.     carid1 = 10000
  43.     carid2 = 20000
  44.     carid3 = 30000
  45.     carid4 = 40000

  46.     def operate(self):
  47.         print('欢迎使用鱼C汽车租赁程序\n')
  48.         while True:
  49.             op = int(input('1.录入汽车;2.租车服务;3.还车服务;4.退出程序:\n'))
  50.             if op == 1:
  51.                 self.register()
  52.             elif op == 2:
  53.                 self.rent_car()
  54.             elif op == 3:
  55.                 self.return_car()
  56.             elif op == 4:
  57.                 break

  58.     def register(self):
  59.         sort_ = int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
  60.         num = int(input('请输入需要录入的数量:'))
  61.         for i in range(num):
  62.             print(f'请录入第{i+1}辆车\n')
  63.             brand = input('品牌:')
  64.             model = input('型号:')
  65.             platenum = input('车牌:')
  66.             dayrent = int(input('租金:'))

  67.             if sort_ == 1:
  68.                 bonus = int(input('补贴:'))
  69.                 carid = self.carid1
  70.                 self.carid1 += 1
  71.                 c = EconomyCar(carid, brand, model, platenum, dayrent, bonus)
  72.             elif sort_ == 2:
  73.                 insurance = int(input('保险:'))
  74.                 carid = self.carid2
  75.                 self.carid2 += 1
  76.                 c = LuxuryCar(carid, brand, model, platenum, dayrent, insurance)
  77.             elif sort_ == 3:
  78.                 loss = int(input('损耗:'))
  79.                 carid = self.carid3
  80.                 self.carid3 += 1
  81.                 c = SportsCar(carid, brand, model, platenum, dayrent, loss)
  82.             elif sort_ == 4:
  83.                 carid = self.carid4
  84.                 self.carid4 += 1
  85.                 adiscount = 0.7 if int(input('租赁天数:')) > 7 else 1
  86.                 c = SUV(carid, brand, model, platenum, dayrent, adiscount)

  87.             self.cars[carid] = c
  88.             if sort_ == 1:
  89.                 self.stocks['EconomyCar'].append(c)
  90.             elif sort_ == 2:
  91.                 self.stocks['LuxuryCar'].append(c)
  92.             elif sort_ == 3:
  93.                 self.stocks['SportsCar'].append(c)
  94.             elif sort_ == 4:
  95.                 self.stocks['SUV'].append(c)

  96.     def rent_car(self):
  97.         print(f'1.经济车型(享有补贴),共有{len(self.stocks["EconomyCar"])}辆。\n')
  98.         if self.stocks['EconomyCar']:
  99.             for each in self.stocks['EconomyCar']:
  100.                 print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}-{each.bonus}(补贴)元\n')
  101.         print(f'2.豪华车型(需额外购买保险),共有{len(self.stocks["LuxuryCar"])}辆。\n')
  102.         if self.stocks['LuxuryCar']:
  103.             for each in self.stocks['LuxuryCar']:
  104.                 print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.insurance}(保险)元\n')
  105.         print(f'3.跑车(需增加损耗费用),共有{len(self.stocks["SportsCar"])}辆。\n')
  106.         if self.stocks['SportsCar']:
  107.             for each in self.stocks['SportsCar']:
  108.                 print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.loss}(损耗)元\n')
  109.         print(f'4.SUV(租赁超过7天,享有额外折上7折优惠),共有{len(self.stocks["SUV"])}辆。\n')
  110.         if self.stocks['SUV']:
  111.             for each in self.stocks['SUV']:
  112.                 print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}元\n')

  113.         idins = int(input('请输入需要租赁的车辆编号:'))
  114.         day = int(input('请输入需要租赁的天数:'))
  115.         total = self.cars[idins].calc_rent(day)
  116.         if str(idins).startswith('1'):
  117.             self.stocks['EconomyCar'].remove(self.cars[idins])
  118.         elif str(idins).startswith('2'):
  119.             self.stocks['LuxuryCar'].remove(self.cars[idins])
  120.         elif str(idins).startswith('3'):
  121.             self.stocks['SportsCar'].remove(self.cars[idins])
  122.         elif str(idins).startswith('4'):
  123.             if day > 7:
  124.                 total = total * 0.7
  125.             self.stocks['SUV'].remove(self.cars[idins])
  126.         print(f'租赁{day}天,总共需要花费:{total}元')
  127.         print('恭喜,租赁成功~')

  128.     def return_car(self):
  129.         idins = int(input('请输入车辆编号:'))
  130.         if str(idins).startswith('1'):
  131.             self.stocks['EconomyCar'].append(self.cars[idins])
  132.         elif str(idins).startswith('2'):
  133.             self.stocks['LuxuryCar'].append(self.cars[idins])
  134.         elif str(idins).startswith('3'):
  135.             self.stocks['SportsCar'].append(self.cars[idins])
  136.         elif str(idins).startswith('4'):
  137.             self.stocks['SUV'].append(self.cars[idins])
  138. main = CarOperation()
  139. main.operate()
复制代码

有用请设置最佳答案谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-21 13:42:10 | 显示全部楼层
问题出在类的继承和调用 `__init__` 方法上。你在代码中没有正确定义子类的构造方法,并且在实例化对象时传递了错误数量的参数。

### 问题解析:
1. **主类 `Car_General` 的构造函数问题:**
   `Car_General` 的 `__init__` 方法只接受 5 个参数(外加 `self`),即:
  
  1. def __init__(self, carid, brand, model, platenum, dayrent):
复制代码

   而你试图在 `register` 方法中使用以下方式实例化:
  
  1. c = Car_General(carid, brand, model, platenum, dayrent, bonus)
复制代码

   这会导致 **多传参数** 的问题,因为 `bonus` 是额外的参数,不属于父类 `Car_General` 的初始化范围。

2. **子类构造函数未正确重写:**
   子类如 `EconomyCar`、`LuxuryCar` 等并没有正确重写它们自己的 `__init__` 方法。在代码中:
  
  1. class EconomyCar(Car_General):
  2.        def __init__(self, bonus):
  3.            super.__init__(carid, brand, model, platenum, dayrent)
  4.            self.bonus = bonus
复制代码

   - 第一行中的 `super.__init__` 调用是错误的,应该是 `super().__init__()`。
   - `carid`、`brand` 等参数并未传入子类的 `__init__` 方法,这意味着子类无法初始化这些参数。

3. **数据结构问题:**
   属性 `stocks` 被定义为一个字典,但在后续代码中试图调用 `append` 方法,然而字典没有 `append` 方法,这会报错。

---

### 修复代码
以下是修复后的代码,解决了上述问题:

  1. [code]
  2. class Car_General:
  3.     def __init__(self, carid, brand, model, platenum, dayrent):
  4.         self.carid = carid
  5.         self.brand = brand
  6.         self.model = model
  7.         self.platenum = platenum
  8.         self.dayrent = dayrent

  9.     def calc_rent(self, day, adiscount=1):
  10.         # 默认计算租金逻辑由子类补充
  11.         return day * self.dayrent * adiscount


  12. class EconomyCar(Car_General):
  13.     def __init__(self, carid, brand, model, platenum, dayrent, bonus):
  14.         super().__init__(carid, brand, model, platenum, dayrent)
  15.         self.bonus = bonus

  16.     def calc_rent(self, day, adiscount=1):
  17.         return day * (self.dayrent - self.bonus) * adiscount


  18. class LuxuryCar(Car_General):
  19.     def __init__(self, carid, brand, model, platenum, dayrent, insurance):
  20.         super().__init__(carid, brand, model, platenum, dayrent)
  21.         self.insurance = insurance

  22.     def calc_rent(self, day, adiscount=1):
  23.         return day * (self.dayrent + self.insurance) * adiscount


  24. class SportsCar(Car_General):
  25.     def __init__(self, carid, brand, model, platenum, dayrent, loss):
  26.         super().__init__(carid, brand, model, platenum, dayrent)
  27.         self.loss = loss

  28.     def calc_rent(self, day, adiscount=1):
  29.         return day * (self.dayrent + self.loss) * adiscount


  30. class SUV(Car_General):
  31.     def __init__(self, carid, brand, model, platenum, dayrent, adiscount):
  32.         super().__init__(carid, brand, model, platenum, dayrent)
  33.         self.adiscount = adiscount

  34.     def calc_rent(self, day):
  35.         discount = self.adiscount if day > 7 else 1
  36.         return day * self.dayrent * discount


  37. class CarOperation:
  38.     def __init__(self):
  39.         self.cars = {}
  40.         self.stocks = {"EconomyCar": [], "LuxuryCar": [], "SportsCar": [], "SUV": []}
  41.         self.carid_counters = {"EconomyCar": 10000, "LuxuryCar": 20000, "SportsCar": 30000, "SUV": 40000}

  42.     def operate(self):
  43.         print("欢迎使用鱼C汽车租赁程序\n")
  44.         while True:
  45.             op = int(input("1.录入汽车;2.租车服务;3.还车服务;4.退出程序:\n"))
  46.             if op == 1:
  47.                 self.register()
  48.             elif op == 2:
  49.                 self.rent_car()
  50.             elif op == 3:
  51.                 self.return_car()
  52.             elif op == 4:
  53.                 break

  54.     def register(self):
  55.         sort_ = int(input("1.经济型车;2.豪华车;3.跑车;4.SUV:"))
  56.         num = int(input("请输入需要录入的数量:"))
  57.         car_types = ["EconomyCar", "LuxuryCar", "SportsCar", "SUV"]
  58.         car_class = car_types[sort_ - 1]

  59.         for i in range(num):
  60.             print(f"请录入第{i+1}辆车\n")
  61.             brand = input("品牌:")
  62.             model = input("型号:")
  63.             platenum = input("车牌:")
  64.             dayrent = int(input("租金:"))

  65.             carid = self.carid_counters[car_class]
  66.             self.carid_counters[car_class] += 1

  67.             if sort_ == 1:
  68.                 bonus = int(input("补贴:"))
  69.                 car = EconomyCar(carid, brand, model, platenum, dayrent, bonus)
  70.             elif sort_ == 2:
  71.                 insurance = int(input("保险:"))
  72.                 car = LuxuryCar(carid, brand, model, platenum, dayrent, insurance)
  73.             elif sort_ == 3:
  74.                 loss = int(input("损耗:"))
  75.                 car = SportsCar(carid, brand, model, platenum, dayrent, loss)
  76.             elif sort_ == 4:
  77.                 adiscount = float(input("优惠折扣(如7折输入0.7):"))
  78.                 car = SUV(carid, brand, model, platenum, dayrent, adiscount)

  79.             self.stocks[car_class].append(car)
  80.             print(f"车辆录入成功,编号为:{carid}\n")

  81.     def rent_car(self):
  82.         for car_type, cars in self.stocks.items():
  83.             print(f"{car_type} 车型,共有 {len(cars)} 辆:")
  84.             for car in cars:
  85.                 print(f"编号:{car.carid},品牌:{car.brand},型号:{car.model},租金:{car.dayrent}")

  86.         carid = int(input("请输入需要租赁的车辆编号:"))
  87.         day = int(input("请输入需要租赁的天数:"))

  88.         for car_type, cars in self.stocks.items():
  89.             for car in cars:
  90.                 if car.carid == carid:
  91.                     total = car.calc_rent(day)
  92.                     print(f"租赁 {day} 天,总共需要花费:{total} 元")
  93.                     self.stocks[car_type].remove(car)
  94.                     print("恭喜,租赁成功~")
  95.                     return
  96.         print("您输入的车辆编号有误!")

  97.     def return_car(self):
  98.         carid = int(input("请输入归还的车辆编号:"))
  99.         # 归还逻辑可进一步完善
  100.         print("还车功能待实现~")
复制代码
[/code]

### 修改点总结:
1. 修正子类的 `__init__` 方法,并使用 `super()` 正确调用父类方法。
2. 在 `calc_rent` 中加入子类的特定逻辑,如补贴、保险、损耗等。
3. `stocks` 改为字典类型,按照车型分类存储。
4. 实现租车时从库存中删除归属车辆的正确逻辑。

运行修复后的代码应能正常工作!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-21 16:20:29 | 显示全部楼层
FishC 发表于 2025-2-21 13:42
问题出在类的继承和调用 `__init__` 方法上。你在代码中没有正确定义子类的构造方法,并且在实例化对象时传 ...

class Car_General:
    def __init__(self,carid,brand,model,platenum,dayrent):
        self.brand=brand
        self.model=model
        self.platenum=platenum
        self.dayrent=dayrent
        self.carid=carid
    def get_brand(self):
        return self.brand
    def get_model(self):
        return self.model
    def get_platenum(self):
        return self.platenum
    def get_dayrent(self):
        return self.dayrent
    def get_carid(self):
        return self.carid
    def calc_rent(self,day,adiscount=1):
        self.day=day
        self.adiscount=adiscount
        self.rent=self.day*(self.dayrent_sum)*self.adiscount
   
class EconomyCar(Car_General):
    def __init__(self,carid,brand,model,platenum,dayrent,bonus):
        super().__init__(carid,brand,model,platenum,dayrent)
        self.bonus=bonus
        self.dayrent_sum=self.dayrent-self.bonus
class LuxuryCar(Car_General):
    def __init__(self,carid,brand,model,platenum,dayrent,insurance):
        super().__init__(carid,brand,model,platenum,dayrent)
        self.insurance=insurance
        self.dayrent_sum=self.dayrent+self.insurance
class SportsCar(Car_General):
    def __init__(self,carid,brand,model,platenum,dayrent,loss):
        super().__init__(carid,brand,model,platenum,dayrent)
        self.loss=loss
        self.dayrent_sum=self.dayrent+self.loss
class SUV(Car_General):
    def __init__(self,carid,brand,model,platenum,dayrent,adiscount):
        super().__init__(carid,brand,model,platenum,dayrent)
        self.adiscount=adiscount
        self.dayrent_sum=self.dayrent
class CarOperation():
    cars={}
    stocks={'EconomyCar':[],'LuxuryCar':[],'SportsCar':[],'SUV':[]}
    carid1=10000
    carid2=20000
    carid3=30000
    carid4=40000
    def operate(self):
        print('欢迎使用鱼C汽车租赁程序\n')
        while True:
            op=int(input('1.录入汽车;2.租车服务;3.还车服务;4.退出程序:\n'))
            if op == 1:
                self.register()
            if op == 2:
                self.rent_car()
            if op == 3:
                self.return_car()
            if op == 4:
                break
    def register(self):
        sort_=int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
        num=int(input('请输入需要录入的数量:'))
        for i in range(num):
            print(f'请录入第{i+1}辆车\n')
            brand=input('品牌:')
            model=input('型号:')
            platenum=input('车牌:')
            dayrent=int(input('租金:'))

            if sort_ ==1:
                bonus=int(input('补贴:'))
                carid=self.carid1
                self.carid1+=1
                c=EconomyCar(carid,brand,model,platenum,dayrent,bonus)
            if sort_ ==2:
                insurance=int(input('保险:'))
                carid=self.carid2
                self.carid2+=1
                c=LuxuryCar(carid,brand,model,platenum,dayrent,insurance)
            if sort_ ==3:
                loss=int(input('损耗:'))
                carid=self.carid3
                self.carid3+=1
                c=SportsCar(carid,brand,model,platenum,dayrent,loss)
            if sort_ ==4:
                carid=self.carid4
                self.carid4+=1
                if day>7:
                    adiscount=0.7
                else:
                    adiscount=1
                c=SUV(carid,brand,model,platenum,dayrent,adiscount)
            self.cars[carid]=c
            if sort_ ==1:
                self.stocks['EconomyCar'].append(c)
            if sort_ ==2:
                self.stocks['LuxuryCar'].append(c)
            if sort_ ==3:
                self.stocks['SportsCar'].append(c)
            if sort_ ==4:
                self.stocks['SUV'].append(c)
    def rent_car(self):
        print(f'1.经济车型(享有补贴),共有{len(self.stocks["EconomyCar"])}辆。\n')
        if self.stocks['EconomyCar']:
            for each in self.stocks['EconomyCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}-{each.bonus}(补贴)元\n')
        print(f'2.豪华车型(需额外购买保险),共有{len(self.stocks["LuxuryCar"])}辆。\n')
        if self.stocks['LuxuryCar']:
            for each in self.stocks['LuxuryCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.insurance}(保险)元\n')
        print(f'3.跑车(需增加损耗费用),共有{len(self.stocks["SportsCar"])}辆。\n')
        if self.stocks['SportsCar']:
            for each in self.stocks['SportsCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.loss}(损耗)元\n')
                print(f'4.SUV(租赁超过7天,享有额外折上7折优惠),共有{len(self.stocks["SUV"])}辆。\n')
        if self.stocks['SUV']:
            for each in self.stocks['SUV']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}元\n')

        idins=int(input('请输入需要租赁的车辆编号:'))
        day=int(input('请输入需要租赁的天数:'))
        total=self.cars[idins].calc_rent(day)
        if str(idins).startswith('1'):
            self.stocks['EconomyCar'].remove(self.cars[idins])
        if str(idins).startswith('2'):
            self.stocks['LuxuryCar'].remove(self.cars[idins])
        if str(idins).startswith('3'):
            self.stocks['SportsCar'].remove(self.cars[idins])   
        if str(idins).startswith('4'):
            if day>7:
                total=total*0.7
                self.stocks['SUV'].remove(self.cars[idins])
            else:
                self.stocks['SUV'].remove(self.cars[idins])
        print(f'租赁{day}天,总共需要花费:{total}元')
        print('恭喜,租赁成功~')   
    def return_car(self):
        idins=int(input('请输入车辆编号:'))
        if str(idins).starswith('1'):
            self.stocks['EconomyCar'].append(self.cars[idins])
        if str(idins).startswith('2'):
            self.stocks['LuxuryCar'].append(self.cars[idins])
        if str(idins).startswith('3'):
            self.stocks['SportsCar'].append(self.cars[idins])   
        if str(idins).startswith('4'):
            self.stocks['SUV'].append(self.cars[idins])
以上这段代码,执行 rent_car()函数,为什么返回的租金total为none ?是哪里出了问题,该如何修改?  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-21 16:23:51 | 显示全部楼层
andreahhhhhh 发表于 2025-02-21 16:20
FishC 发表于 2025-2-21 13:42
问题出在类的继承和调 ...


你代码中的 `total` 返回值为 `None` 是因为主类 `Car_General` 中的 `calc_rent` 方法没有显式返回计算结果,而是仅仅将计算结果赋值给了实例属性 `self.rent`,导致在调用 `calc_rent` 方法时并未返回实际的租金。以下是问题的关键点和解决方法。

---

### 问题原因分析

1. **`calc_rent` 方法缺少返回值:**
   在 `Car_General` 类中,`calc_rent` 方法的最后并没有使用 `return` 返回计算结果:
  
  1. def calc_rent(self, day, adiscount=1):
  2.        self.day = day
  3.        self.adiscount = adiscount
  4.        self.rent = self.day * (self.dayrent_sum) * self.adiscount
复制代码

   这里计算出的结果被赋值给 `self.rent`,但这个值并没有返回。因此,调用 `calc_rent` 时,默认返回值是 `None`。

2. **实例化的 `cars` 未正确调用特定子类的 `calc_rent` 方法:**
   `EconomyCar` 等子类已经重写了 `calc_rent` 方法,但 `rent_car` 函数中调用的是通用的 `Car_General.calc_rent`,而不是具体子类的逻辑。如果子类的数据结构或方法与父类有差异,也可能导致不正确的结果。

3. **逻辑错误:`self.cars` 不一定是 `idins` 对应车辆:**
   在 `rent_car` 方法中,`idins`(输入的车辆编号)需要找到对应车辆对象,但程序中直接使用了 `self.cars`,这导致可能取到的车辆对象与用户输入的编号不匹配。

---

### 修复方法

按照以上问题,具体修改如下:

#### 修改 1:为 `calc_rent` 方法添加返回值
修改 `Car_General` 和所有子类的 `calc_rent` 方法,确保每次调用都返回总租金:

  1. class Car_General:
  2.     def calc_rent(self, day, adiscount=1):
  3.         self.day = day
  4.         self.adiscount = adiscount
  5.         self.rent = self.day * (self.dayrent_sum) * self.adiscount
  6.         return self.rent  # 添加返回值
复制代码


子类中无需额外重复定义返回逻辑,因为它们继承自父类的 `calc_rent` 方法。

---

#### 修改 2:在 `rent_car` 查找与 `idins` 对应的车辆
目前代码使用 `self.cars` 调用 `calc_rent`,但没有明确 `idins` 是否匹配特定车辆。在租车逻辑中,应先从库存中找到用户输入的车辆编号对应的车辆对象,然后计算租金。

修复后的代码如下:

  1. def rent_car(self):
  2.     print("1.经济车型,共有以下车辆:")
  3.     for each in self.stocks['EconomyCar']:
  4.         print(f"车辆编号:{each.carid}, 品牌:{each.brand}, 型号:{each.model}, 日租金:{each.dayrent} - {each.bonus}(补贴)元")

  5.     print("2.豪华车型,共有以下车辆:")
  6.     for each in self.stocks['LuxuryCar']:
  7.         print(f"车辆编号:{each.carid}, 品牌:{each.brand}, 型号:{each.model}, 日租金:{each.dayrent} + {each.insurance}(保险)元")

  8.     print("3.跑车,共有以下车辆:")
  9.     for each in self.stocks['SportsCar']:
  10.         print(f"车辆编号:{each.carid}, 品牌:{each.brand}, 型号:{each.model}, 日租金:{each.dayrent} + {each.loss}(损耗)元")

  11.     print("4.SUV,共有以下车辆:")
  12.     for each in self.stocks['SUV']:
  13.         print(f"车辆编号:{each.carid}, 品牌:{each.brand}, 型号:{each.model}, 日租金:{each.dayrent}元")

  14.     idins = int(input("请输入需要租赁的车辆编号:"))
  15.     day = int(input("请输入需要租赁的天数:"))

  16.     # 查找车辆对象
  17.     for car_type, car_list in self.stocks.items():
  18.         for car in car_list:
  19.             if car.carid == idins:  # 找到对应车辆
  20.                 total = car.calc_rent(day)  # 调用子类的 calc_rent 方法
  21.                 car_list.remove(car)  # 从库存中移除已租出的车辆
  22.                 print(f"租赁 {day} 天,总共需要花费:{total} 元")
  23.                 return
  24.     print("未找到对应编号的车辆,请检查后重新输入!")
复制代码


---

#### 修改 3:初始化 stocks 时为每种类型创建空列表
`stocks` 属性应为字典类型,其中每个键值对应一个空列表,用于存储不同类型的车辆对象:

  1. stocks = {'EconomyCar': [], 'LuxuryCar': [], 'SportsCar': [], 'SUV': []}
复制代码


此外,在 `register` 方法中,应将录入的车辆对象添加到相应类别的列表中:

  1. if sort_ == 1:
  2.     self.stocks['EconomyCar'].append(c)
  3. elif sort_ == 2:
  4.     self.stocks['LuxuryCar'].append(c)
  5. elif sort_ == 3:
  6.     self.stocks['SportsCar'].append(c)
  7. elif sort_ == 4:
  8.     self.stocks['SUV'].append(c)
复制代码


---

### 修复后的完整代码片段

以下是修复后的核心部分代码:

  1. class Car_General:
  2.     def __init__(self, carid, brand, model, platenum, dayrent):
  3.         self.carid = carid
  4.         self.brand = brand
  5.         self.model = model
  6.         self.platenum = platenum
  7.         self.dayrent = dayrent

  8.     def calc_rent(self, day, adiscount=1):
  9.         self.day = day
  10.         self.adiscount = adiscount
  11.         self.rent = self.day * self.dayrent_sum * self.adiscount
  12.         return self.rent  # 确保返回计算结果


  13. class EconomyCar(Car_General):
  14.     def __init__(self, carid, brand, model, platenum, dayrent, bonus):
  15.         super().__init__(carid, brand, model, platenum, dayrent)
  16.         self.bonus = bonus
  17.         self.dayrent_sum = self.dayrent - self.bonus


  18. class CarOperation:
  19.     def __init__(self):
  20.         self.stocks = {'EconomyCar': [], 'LuxuryCar': [], 'SportsCar': [], 'SUV': []}
  21.         self.carid1 = 10000
  22.         # 其他初始化内容略

  23.     def rent_car(self):
  24.         # 修正后的租车逻辑...
  25.         pass
复制代码


---

### 总结

- 为 `calc_rent` 方法添加返回值,确保调用时有正确的输出。
- 在 `rent_car` 方法里根据车辆编号查找实际车辆对象,而不是直接操作 `self.cars`。
- 初始化 `stocks` 时,避免出现未赋值的 Key。
- 正确管理库存,确保租出的车辆能从列表中移除。

运行修复后的代码,`total` 将返回正确的租金计算结果!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-22 08:18:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sfqxx 于 2025-2-22 08:21 编辑

错误的原因在于 Car_General 类的 __init__ 方法只接受 5 个参数(self、carid、brand、model、platenum、dayrent),但在 register 方法中,你尝试传递了额外的参数(如 bonus、insurance、loss 等),导致参数数量不匹配。

try this:
  1. class Car_General:
  2.     def __init__(self, carid, brand, model, platenum, dayrent, bonus=0, insurance=0, loss=0, adiscount=1):
  3.         self.brand = brand
  4.         self.model = model
  5.         self.platenum = platenum
  6.         self.dayrent = dayrent
  7.         self.carid = carid
  8.         self.bonus = bonus
  9.         self.insurance = insurance
  10.         self.loss = loss
  11.         self.adiscount = adiscount

  12.     def get_brand(self):
  13.         return self.brand

  14.     def get_model(self):
  15.         return self.model

  16.     def get_platenum(self):
  17.         return self.platenum

  18.     def get_dayrent(self):
  19.         return self.dayrent

  20.     def get_carid(self):
  21.         return self.carid

  22.     def calc_rent(self, day, adiscount=1):
  23.         self.day = day
  24.         self.adiscount = adiscount
  25.         self.rent = self.day * (self.dayrent - self.bonus + self.insurance + self.loss) * self.adiscount
  26.         return self.rent

  27. class EconomyCar(Car_General):
  28.     def __init__(self, carid, brand, model, platenum, dayrent, bonus):
  29.         super().__init__(carid, brand, model, platenum, dayrent, bonus=bonus)

  30. class LuxuryCar(Car_General):
  31.     def __init__(self, carid, brand, model, platenum, dayrent, insurance):
  32.         super().__init__(carid, brand, model, platenum, dayrent, insurance=insurance)

  33. class SportsCar(Car_General):
  34.     def __init__(self, carid, brand, model, platenum, dayrent, loss):
  35.         super().__init__(carid, brand, model, platenum, dayrent, loss=loss)

  36. class SUV(Car_General):
  37.     def __init__(self, carid, brand, model, platenum, dayrent, adiscount=1):
  38.         super().__init__(carid, brand, model, platenum, dayrent, adiscount=adiscount)

  39. class CarOperation:
  40.     cars = {}
  41.     stocks = {'EconomyCar': [], 'LuxuryCar': [], 'SportsCar': [], 'SUV': []}
  42.     carid1 = 10000
  43.     carid2 = 20000
  44.     carid3 = 30000
  45.     carid4 = 40000

  46.     def operate(self):
  47.         print('欢迎使用鱼C汽车租赁程序\n')
  48.         while True:
  49.             op = int(input('1.录入汽车;2.租车服务;3.还车服务;4.退出程序:\n'))
  50.             if op == 1:
  51.                 self.register()
  52.             elif op == 2:
  53.                 self.rent_car()
  54.             elif op == 3:
  55.                 self.return_car()
  56.             elif op == 4:
  57.                 break

  58.     def register(self):
  59.         sort_ = int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
  60.         num = int(input('请输入需要录入的数量:'))
  61.         for i in range(num):
  62.             print(f'请录入第{i+1}辆车\n')
  63.             brand = input('品牌:')
  64.             model = input('型号:')
  65.             platenum = input('车牌:')
  66.             dayrent = int(input('租金:'))

  67.             if sort_ == 1:
  68.                 bonus = int(input('补贴:'))
  69.                 carid = self.carid1
  70.                 self.carid1 += 1
  71.                 c = EconomyCar(carid, brand, model, platenum, dayrent, bonus)
  72.             elif sort_ == 2:
  73.                 insurance = int(input('保险:'))
  74.                 carid = self.carid2
  75.                 self.carid2 += 1
  76.                 c = LuxuryCar(carid, brand, model, platenum, dayrent, insurance)
  77.             elif sort_ == 3:
  78.                 loss = int(input('损耗:'))
  79.                 carid = self.carid3
  80.                 self.carid3 += 1
  81.                 c = SportsCar(carid, brand, model, platenum, dayrent, loss)
  82.             elif sort_ == 4:
  83.                 carid = self.carid4
  84.                 self.carid4 += 1
  85.                 adiscount = 0.7 if int(input('租赁天数:')) > 7 else 1
  86.                 c = SUV(carid, brand, model, platenum, dayrent, adiscount)

  87.             self.cars[carid] = c
  88.             if sort_ == 1:
  89.                 self.stocks['EconomyCar'].append(c)
  90.             elif sort_ == 2:
  91.                 self.stocks['LuxuryCar'].append(c)
  92.             elif sort_ == 3:
  93.                 self.stocks['SportsCar'].append(c)
  94.             elif sort_ == 4:
  95.                 self.stocks['SUV'].append(c)

  96.     def rent_car(self):
  97.         print(f'1.经济车型(享有补贴),共有{len(self.stocks["EconomyCar"])}辆。\n')
  98.         if self.stocks['EconomyCar']:
  99.             for each in self.stocks['EconomyCar']:
  100.                 print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}-{each.bonus}(补贴)元\n')
  101.         print(f'2.豪华车型(需额外购买保险),共有{len(self.stocks["LuxuryCar"])}辆。\n')
  102.         if self.stocks['LuxuryCar']:
  103.             for each in self.stocks['LuxuryCar']:
  104.                 print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.insurance}(保险)元\n')
  105.         print(f'3.跑车(需增加损耗费用),共有{len(self.stocks["SportsCar"])}辆。\n')
  106.         if self.stocks['SportsCar']:
  107.             for each in self.stocks['SportsCar']:
  108.                 print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.loss}(损耗)元\n')
  109.         print(f'4.SUV(租赁超过7天,享有额外折上7折优惠),共有{len(self.stocks["SUV"])}辆。\n')
  110.         if self.stocks['SUV']:
  111.             for each in self.stocks['SUV']:
  112.                 print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}元\n')

  113.         idins = int(input('请输入需要租赁的车辆编号:'))
  114.         day = int(input('请输入需要租赁的天数:'))
  115.         total = self.cars[idins].calc_rent(day)
  116.         if str(idins).startswith('1'):
  117.             self.stocks['EconomyCar'].remove(self.cars[idins])
  118.         elif str(idins).startswith('2'):
  119.             self.stocks['LuxuryCar'].remove(self.cars[idins])
  120.         elif str(idins).startswith('3'):
  121.             self.stocks['SportsCar'].remove(self.cars[idins])
  122.         elif str(idins).startswith('4'):
  123.             if day > 7:
  124.                 total = total * 0.7
  125.             self.stocks['SUV'].remove(self.cars[idins])
  126.         print(f'租赁{day}天,总共需要花费:{total}元')
  127.         print('恭喜,租赁成功~')

  128.     def return_car(self):
  129.         idins = int(input('请输入车辆编号:'))
  130.         if str(idins).startswith('1'):
  131.             self.stocks['EconomyCar'].append(self.cars[idins])
  132.         elif str(idins).startswith('2'):
  133.             self.stocks['LuxuryCar'].append(self.cars[idins])
  134.         elif str(idins).startswith('3'):
  135.             self.stocks['SportsCar'].append(self.cars[idins])
  136.         elif str(idins).startswith('4'):
  137.             self.stocks['SUV'].append(self.cars[idins])
  138. main = CarOperation()
  139. main.operate()
复制代码

有用请设置最佳答案谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-4 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表