鱼C论坛

 找回密码
 立即注册
查看: 284|回复: 7

[已解决]代码求助

[复制链接]
发表于 2025-2-20 15:15:09 | 显示全部楼层 |阅读模式

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

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

x
class Car_General:
    def __init__(self,carid,brand,model,platenum,dayrent,bonus=0,insurance=0,loss=0,adiscount=1):
        self.brand=brand
        self.model=model
        self.platenum=platenum
        self.dayrent=dayrent
        self.carid=carid
        self.bonus=bonus
        self.insurance=insurance
        self.loss=loss
        self.adiscount=adiscount
    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):
        self.bonus=bonus
class LuxuryCar(Car_General):
    def __init__(self,insurance):
        self.insurance=insurance
class SportsCar(Car_General):
    def __init__(self,loss):
        self.loss=loss
class SUV(Car_General):
    def __init__(self,adiscount):
        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('补贴:'))
                self.carid=self.carid1
                carid1+=1
            if sort_ ==2:
                insurance=int(input('保险:'))
                self.carid=self.carid2
                carid2+=1
            if sort_ ==3:
                loss=int(input('损耗:'))
                self.carid=self.carid3
                carid3+=1
            if sort_ ==4:
                self.carid=self.carid4
                carid4+=1
            c=Car_General(carid,brand,model,platenum,dayrent,bonus=0,insurance=0,loss=0,adiscount=1)
            cars[self.carid]=c
            if sort_ ==1:
                stocks['EconomyCar'].append(c)
            if sort_ ==2:
                stocks['LuxuryCar'].append(c)
            if sort_ ==3:
                stocks['SportsCar'].append(c)
            if sort_ ==4:
                stocks['SUV'].append(c)
    def rent_car(self):
        print(f'1.经济车型(享有补贴),共有{len(stocks["EconomyCar"])}辆。\n')
        if stocks['EconomyCar']:
            for each in stocks['EconomyCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}-{each.bonus}(补贴)元\n')
        print(f'2.豪华车型(需额外购买保险),共有{len(stocks["LuxuryCar"])}辆。\n')
        if stocks['LuxuryCar']:
            for each in stocks['LuxuryCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.insurance}(保险)元\n')
        print(f'3.跑车(需增加损耗费用),共有{len(stocks["SportsCar"])}辆。\n')
        if stocks['SportsCar']:
            for each in stocks['SportsCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.loss}(损耗)元\n')
        print(f'3.跑车(需增加损耗费用),共有{len(stocks["SportsCar"])}辆。\n')
        if stocks['SportsCar']:
            for each in stocks['SportsCar']:
                print(f'车辆编号:{each.carid},品牌:{each.brand},型号:{each.model},日租金:{each.dayrent}+{each.loss}(损耗)元\n')
        print(f'4.SUV(租赁超过7天,享有额外折上7折优惠),共有{len(stocks["SUV"])}辆。\n')
        if stocks['SUV']:
            for each in 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'):
            stocks['EconomyCar'].remove(cars[idins])
        if idins.startswith('2'):
            stocks['LuxuryCar'].remove(cars[idins])
        if idins.startswith('3'):
            stocks['SportsCar'].remove(cars[idins])   
        if idins.startswith('4'):
            if day>7:
                total=total*0.7
                stocks['SUV'].remove(cars[idins])
            else:
                stocks['SUV'].remove(cars[idins])
        print(f'租赁{day}天,总共需要花费:{total}元')
        print('恭喜,租赁成功~')   
    def return_car(self):
        idins=int(input('请输入车辆编号:'))
        if idins.starswith('1'):
            stocks['EconomyCar'].append(cars[idins])
        if idins.startswith('2'):
            stocks['LuxuryCar'].append(cars[idins])
        if idins.startswith('3'):
            stocks['SportsCar'].append(cars[idins])   
        if idins.startswith('4'):
            stocks['SUV'].append(cars[idins])
以上代码其中的这一句,如何实现正确赋值呢?      
                self.carid=self.carid1
                carid1+=1
最佳答案
2025-2-20 18:06:01
andreahhhhhh 发表于 2025-02-20 18:03
FishC 发表于 2025-2-20 17:56
上段代码中这句:

...


要实现 `Car_General` 类中的参数 `bonus`, `insurance`, `loss`, `adiscount` 具有默认值,并且在对象无相应参数传入时使用默认值,你只需要在实例化对象时正确传递这些参数即可。

首先确保 `Car_General` 类的构造函数设置了默认值:

  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
复制代码


接下来,在 `register` 方法中,需要根据不同的车辆类型传递相应的参数。如果没有提供相应参数,则使用默认值:

  1. def register(self):
  2.     sort_ = int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
  3.     num = int(input('请输入需要录入的数量:'))
  4.    
  5.     for i in range(num):
  6.         print(f'请录入第{i+1}辆车\n')
  7.         brand = input('品牌:')
  8.         model = input('型号:')
  9.         platenum = input('车牌:')
  10.         dayrent = int(input('租金:'))

  11.         if sort_ == 1:  # 经济型车
  12.             bonus = int(input('补贴:'))
  13.             carid = self.carid1
  14.             self.carid1 += 1
  15.             c = Car_General(carid, brand, model, platenum, dayrent, bonus=bonus)

  16.         elif sort_ == 2:  # 豪华车
  17.             insurance = int(input('保险:'))
  18.             carid = self.carid2
  19.             self.carid2 += 1
  20.             c = Car_General(carid, brand, model, platenum, dayrent, insurance=insurance)

  21.         elif sort_ == 3:  # 跑车
  22.             loss = int(input('损耗:'))
  23.             carid = self.carid3
  24.             self.carid3 += 1
  25.             c = Car_General(carid, brand, model, platenum, dayrent, loss=loss)

  26.         elif sort_ == 4:  # SUV
  27.             carid = self.carid4
  28.             self.carid4 += 1
  29.             c = Car_General(carid, brand, model, platenum, dayrent, adiscount=1)

  30.         # 记录到库存
  31.         self.cars[carid] = c
  32.         self.stocks.append(c)
复制代码


这样,如果在创建对象时没有传递相应的参数,则使用默认值。为了完整性,请确保 `stocks` 和 `cars` 使用合适的数据结构存储数据。例如,可以使用列表和字典:

  1. class CarOperation:
  2.     cars = {}
  3.     stocks = []

  4.     carid1 = 10000
  5.     carid2 = 20000
  6.     carid3 = 30000
  7.     carid4 = 40000

  8.     def operate(self):
  9.         print('欢迎使用鱼C汽车租赁程序\n')
  10.         while True:
  11.             op = int(input('1.录入汽车;2.租车服务;3.还车服务;4.退出程序:\n'))
  12.             if op == 1:
  13.                 self.register()
  14.             elif op == 2:
  15.                 self.rent_car()
  16.             elif op == 3:
  17.                 self.return_car()
  18.             elif op == 4:
  19.                 break

  20.     def register(self):
  21.         sort_ = int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
  22.         num = int(input('请输入需要录入的数量:'))

  23.         for i in range(num):
  24.             print(f'请录入第{i+1}辆车\n')
  25.             brand = input('品牌:')
  26.             model = input('型号:')
  27.             platenum = input('车牌:')
  28.             dayrent = int(input('租金:'))

  29.             if sort_ == 1:  # 经济型车
  30.                 bonus = int(input('补贴:'))
  31.                 carid = self.carid1
  32.                 self.carid1 += 1
  33.                 c = Car_General(carid, brand, model, platenum, dayrent, bonus=bonus)

  34.             elif sort_ == 2:  # 豪华车
  35.                 insurance = int(input('保险:'))
  36.                 carid = self.carid2
  37.                 self.carid2 += 1
  38.                 c = Car_General(carid, brand, model, platenum, dayrent, insurance=insurance)

  39.             elif sort_ == 3:  # 跑车
  40.                 loss = int(input('损耗:'))
  41.                 carid = self.carid3
  42.                 self.carid3 += 1
  43.                 c = Car_General(carid, brand, model, platenum, dayrent, loss=loss)

  44.             elif sort_ == 4:  # SUV
  45.                 carid = self.carid4
  46.                 self.carid4 += 1
  47.                 c = Car_General(carid, brand, model, platenum, dayrent, adiscount=1)

  48.             # 记录到库存
  49.             self.cars[carid] = c
  50.             self.stocks.append(c)
复制代码


这样,当实例化 `Car_General` 时,如果不传递 `bonus`, `insurance`, `loss`, `adiscount` 等参数,会使用默认值。

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

使用道具 举报

发表于 2025-2-20 15:15:48 | 显示全部楼层
你在代码中想要正确更新每种车的车ID,建议在类实例中使用类属性来保存车ID,并在实例化不同类型的车时增加该车ID。以下是你的代码的一些修正:

1. 在 CarOperation 类中定义每种车的初始车ID。
2. 修正代码中的一些错误。

以下是修改后的代码:

  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.         return self.day * (self.dayrent - self.bonus + self.insurance + self.loss) * self.adiscount


  26. class EconomyCar(Car_General):
  27.     pass


  28. class LuxuryCar(Car_General):
  29.     pass


  30. class SportsCar(Car_General):
  31.     pass


  32. class SUV(Car_General):
  33.     pass


  34. class CarOperation:
  35.     cars = {}
  36.     stocks = {'EconomyCar': [], 'LuxuryCar': [], 'SportsCar': [], 'SUV': []}
  37.     carid1 = 10000
  38.     carid2 = 20000
  39.     carid3 = 30000
  40.     carid4 = 40000

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

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

  62.             if sort_ == 1:
  63.                 bonus = int(input('补贴:'))
  64.                 carid = self.carid1
  65.                 self.carid1 += 1
  66.                 c = EconomyCar(carid, brand, model, platenum, dayrent, bonus=bonus)
  67.             elif sort_ == 2:
  68.                 insurance = int(input('保险:'))
  69.                 carid = self.carid2
  70.                 self.carid2 += 1
  71.                 c = LuxuryCar(carid, brand, model, platenum, dayrent, insurance=insurance)
  72.             elif sort_ == 3:
  73.                 loss = int(input('损耗:'))
  74.                 carid = self.carid3
  75.                 self.carid3 += 1
  76.                 c = SportsCar(carid, brand, model, platenum, dayrent, loss=loss)
  77.             elif sort_ == 4:
  78.                 carid = self.carid4
  79.                 self.carid4 += 1
  80.                 c = SUV(carid, brand, model, platenum, dayrent, adiscount=1)

  81.             self.cars[carid] = c
  82.             self.stocks[c.__class__.__name__].append(c)

  83.     def rent_car(self):
  84.         print(f'1.经济车型(享有补贴),共有{len(self.stocks["EconomyCar"])}辆。\n')
  85.         for each in self.stocks["EconomyCar"]:
  86.             print(f'车辆编号:{each.get_carid()},品牌:{each.get_brand()},型号:{each.get_model()},日租金:{each.get_dayrent()}-{each.bonus}(补贴)元\n')

  87.         print(f'2.豪华车型(需额外购买保险),共有{len(self.stocks["LuxuryCar"])}辆。\n')
  88.         for each in self.stocks["LuxuryCar"]:
  89.             print(f'车辆编号:{each.get_carid()},品牌:{each.get_brand()},型号:{each.get_model()},日租金:{each.get_dayrent()}+{each.insurance}(保险)元\n')

  90.         print(f'3.跑车(需增加损耗费用),共有{len(self.stocks["SportsCar"])}辆。\n')
  91.         for each in self.stocks["SportsCar"]:
  92.             print(f'车辆编号:{each.get_carid()},品牌:{each.get_brand()},型号:{each.get_model()},日租金:{each.get_dayrent()}+{each.loss}(损耗)元\n')

  93.         print(f'4.SUV(租赁超过7天,享有额外折上7折优惠),共有{len(self.stocks["SUV"])}辆。\n')
  94.         for each in self.stocks["SUV"]:
  95.             print(f'车辆编号:{each.get_carid()},品牌:{each.get_brand()},型号:{each.get_model()},日租金:{each.get_dayrent()}元\n')

  96.         idins = int(input('请输入需要租赁的车辆编号:'))
  97.         day = int(input('请输入需要租赁的天数:'))
  98.         total = self.cars[idins].calc_rent(day)

  99.         if str(idins).startswith('1'):
  100.             self.stocks["EconomyCar"].remove(self.cars[idins])
  101.         elif str(idins).startswith('2'):
  102.             self.stocks["LuxuryCar"].remove(self.cars[idins])
  103.         elif str(idins).startswith('3'):
  104.             self.stocks["SportsCar"].remove(self.cars[idins])
  105.         elif str(idins).startswith('4'):
  106.             if day > 7:
  107.                 total *= 0.7
  108.             self.stocks["SUV"].remove(self.cars[idins])

  109.         print(f'租赁{day}天,总共需要花费:{total}元')
  110.         print('恭喜,租赁成功~')

  111.     def return_car(self):
  112.         idins = int(input('请输入车辆编号:'))
  113.         if str(idins).startswith('1'):
  114.             self.stocks["EconomyCar"].append(self.cars[idins])
  115.         elif str(idins).startswith('2'):
  116.             self.stocks["LuxuryCar"].append(self.cars[idins])
  117.         elif str(idins).startswith('3'):
  118.             self.stocks["SportsCar"].append(self.cars[idins])
  119.         elif str(idins).startswith('4'):
  120.             self.stocks["SUV"].append(self.cars[idins])

  121. # 运行操作界面
  122. operation = CarOperation()
  123. operation.operate()
复制代码


请确保上述代码不会产生任何缩进或语法错误。另外,注意在 CarOperation 类中正确使用实例属性和类属性以避免引用错误。

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

使用道具 举报

 楼主| 发表于 2025-2-20 17:23:31 | 显示全部楼层
FishC 发表于 2025-2-20 15:15
你在代码中想要正确更新每种车的车ID,建议在类实例中使用类属性来保存车ID,并在实例化不同类型的车时增加 ...

方法中的参数支持默认值吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-20 17:23:40 | 显示全部楼层
andreahhhhhh 发表于 2025-02-20 17:23
FishC 发表于 2025-2-20 15:15
你在代码中想要正确更 ...


是的,Python 方法中的参数**支持默认值**。

当方法定义中为某个参数提供了默认值时,如果调用方法时没有显式传递该参数的值,那么方法会使用默认值。使用默认值的参数必须放在所有**没有默认值的参数的后面**!

以下是一个示例:

  1. class Example:
  2.     def greet(self, name="鱼油", message="你好呀!"):
  3.         print(f"{name},{message}")

  4. # 创建对象并调用方法
  5. example = Example()

  6. # 调用时不传递参数,使用默认值
  7. example.greet()  # 输出:鱼油,你好呀!

  8. # 只修改第一个参数
  9. example.greet(name="小甲鱼")  # 输出:小甲鱼,你好呀!

  10. # 修改所有参数
  11. example.greet(name="小甲鱼", message="欢迎学习编程!")  # 输出:小甲鱼,欢迎学习编程!
复制代码


### 注意事项:
- 默认值参数的顺序非常重要。需要将**无默认值的参数**放在前面,有默认值的参数放在后面。
例如,以下代码会报错:
  1. def example_func(message="你好", name):  # 错误,默认值参数须放在后面
  2.     pass
复制代码


正确写法为:
  1. def example_func(name, message="你好"):  # 正确
  2.     pass
复制代码


如果你有更多问题,请随时提问!

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

使用道具 举报

 楼主| 发表于 2025-2-20 17:52:15 | 显示全部楼层
FishC 发表于 2025-2-20 17:23
是的,Python 方法中的参数**支持默认值**。

当方法定义中为某个参数提供了默认值时,如果调用方法 ...

class Car_General:
    def __init__(self,carid,brand,model,platenum,dayrent,bonus=0,insurance=0,loss=0,adiscount=1):
        self.brand=brand
        self.model=model
        self.platenum=platenum
        self.dayrent=dayrent
        self.carid=carid
        self.bonus=bonus
        self.insurance=insurance
        self.loss=loss
        self.adiscount=adiscount
    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):
        self.bonus=bonus
class LuxuryCar(Car_General):
    def __init__(self,insurance):
        self.insurance=insurance
class SportsCar(Car_General):
    def __init__(self,loss):
        self.loss=loss
class SUV(Car_General):
    def __init__(self,adiscount):
        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=0,insurance=0,loss=0,adiscount=1)
            if sort_ ==2:
                insurance=int(input('保险:'))
                carid=self.carid2
                self.carid2+=1
                c=Car_General(carid,brand,model,platenum,dayrent,bonus=0,insurance=0,loss=0,adiscount=1)
            if sort_ ==3:
                loss=int(input('损耗:'))
                carid=self.carid3
                self.carid3+=1
                c=Car_General(carid,brand,model,platenum,dayrent,bonus=0,insurance=0,loss=0,adiscount=1)
            if sort_ ==4:
                carid=self.carid4
                self.carid4+=1
                c=Car_General(carid,brand,model,platenum,dayrent,bonus=0,insurance=0,loss=0,adiscount=1)
            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])

上段代码中c=Car_General(carid,brand,model,platenum,dayrent,bonus=0,insurance=0,loss=0,adiscount=1)这一句有问题吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-20 17:56:23 | 显示全部楼层
andreahhhhhh 发表于 2025-02-20 17:52
FishC 发表于 2025-2-20 17:23
是的,Python 方法中 ...


上段代码中这句:


  1. c = Car_General(carid, brand, model, platenum, dayrent, bonus=0, insurance=0, loss=0, adiscount=1)
复制代码


是有问题的。**原因**与问题如下:  

### 1. **缺乏正确传递参数**
这行代码使用了 `Car_General` 类的构造函数,但传入的参数未能匹配实际情况。例如:
- 你在不同的条件下(如录入经济型车、豪华车等)为 `bonus`, `insurance`, `loss` 等传递了固定值 `0`,没有实际使用用户输入的具体值。
- 此外,你为每种车类型提供了专门的子类(如 `EconomyCar`, `LuxuryCar` 等),但却在此使用了 `Car_General` 类,而不是相应的子类。这不符合面向对象设计的原则。

### 2. **忽视不同子类的初始化逻辑**
你的 `EconomyCar`, `LuxuryCar`, `SportsCar` 和 `SUV` 类都重新定义了它们的 `__init__` 方法,但它们的实现不完整。例如,`EconomyCar` 的 `__init__` 方法只初始化了 `bonus` 属性,没有初始化其他通用属性(如 `brand`, `model`, 等)。导致实例化这些子类时,程序会报错。

---

### 修改建议
以下是对 `c = Car_General(...)` 这一句的修正,以及相关子类的问题的全面调整:

#### 修改问题中的语句
在 `register` 方法中,根据选择的车辆类型,应该实例化具体的子类,并正确传入所需的参数。


  1. if sort_ == 1:  # 经济型车
  2.     bonus = int(input('补贴:'))
  3.     carid = self.carid1
  4.     self.carid1 += 1
  5.     c = EconomyCar(carid, brand, model, platenum, dayrent, bonus=bonus)

  6. elif sort_ == 2:  # 豪华车
  7.     insurance = int(input('保险:'))
  8.     carid = self.carid2
  9.     self.carid2 += 1
  10.     c = LuxuryCar(carid, brand, model, platenum, dayrent, insurance=insurance)

  11. elif sort_ == 3:  # 跑车
  12.     loss = int(input('损耗:'))
  13.     carid = self.carid3
  14.     self.carid3 += 1
  15.     c = SportsCar(carid, brand, model, platenum, dayrent, loss=loss)

  16. elif sort_ == 4:  # SUV
  17.     carid = self.carid4
  18.     self.carid4 += 1
  19.     c = SUV(carid, brand, model, platenum, dayrent, adiscount=1)
复制代码


---

#### 修复子类的 `__init__`
确保每个子类在初始化时能够正确继承父类的属性,同时增加其特有的属性。这里可以通过调用父类的 `__init__` 方法来简化逻辑,例如:


  1. class EconomyCar(Car_General):
  2.     def __init__(self, carid, brand, model, platenum, dayrent, bonus=0):
  3.         super().__init__(carid, brand, model, platenum, dayrent, bonus=bonus)

  4. class LuxuryCar(Car_General):
  5.     def __init__(self, carid, brand, model, platenum, dayrent, insurance=0):
  6.         super().__init__(carid, brand, model, platenum, dayrent, insurance=insurance)

  7. class SportsCar(Car_General):
  8.     def __init__(self, carid, brand, model, platenum, dayrent, loss=0):
  9.         super().__init__(carid, brand, model, platenum, dayrent, loss=loss)

  10. class SUV(Car_General):
  11.     def __init__(self, carid, brand, model, platenum, dayrent, adiscount=1):
  12.         super().__init__(carid, brand, model, platenum, dayrent, adiscount=adiscount)
复制代码


---

### 最终正确的 `register` 方法
结合上述修正,完整的 `register` 方法如下:


  1. def register(self):
  2.     sort_ = int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
  3.     num = int(input('请输入需要录入的数量:'))
  4.    
  5.     for i in range(num):
  6.         print(f'请录入第{i+1}辆车\n')
  7.         brand = input('品牌:')
  8.         model = input('型号:')
  9.         platenum = input('车牌:')
  10.         dayrent = int(input('租金:'))

  11.         if sort_ == 1:  # 经济型车
  12.             bonus = int(input('补贴:'))
  13.             carid = self.carid1
  14.             self.carid1 += 1
  15.             c = EconomyCar(carid, brand, model, platenum, dayrent, bonus=bonus)

  16.         elif sort_ == 2:  # 豪华车
  17.             insurance = int(input('保险:'))
  18.             carid = self.carid2
  19.             self.carid2 += 1
  20.             c = LuxuryCar(carid, brand, model, platenum, dayrent, insurance=insurance)

  21.         elif sort_ == 3:  # 跑车
  22.             loss = int(input('损耗:'))
  23.             carid = self.carid3
  24.             self.carid3 += 1
  25.             c = SportsCar(carid, brand, model, platenum, dayrent, loss=loss)

  26.         elif sort_ == 4:  # SUV
  27.             carid = self.carid4
  28.             self.carid4 += 1
  29.             c = SUV(carid, brand, model, platenum, dayrent, adiscount=1)

  30.         # 记录到库存
  31.         self.cars[carid] = c
  32.         self.stocks.append(c)
复制代码


---

### 总结
你的 `c = Car_General(...)` 是可以正常运行的,但并没有根据车辆类型动态地创建适当的子类实例。这违背了面向对象编程的基本思想。按照上述修改,通过实例化特定子类,并调用父类的构造函数,你可以优雅地实现程序逻辑。

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

使用道具 举报

 楼主| 发表于 2025-2-20 18:03:54 | 显示全部楼层
FishC 发表于 2025-2-20 17:56
上段代码中这句:

c = Car_General(carid, brand, model, platenum, dayrent, bonus=0, insurance=0, loss=0, adiscount=1)
这一句中 bonus\insurance\loss等我想实现为设置默认值,当对象无相应参数传入时,使用默认值,该如何修改?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-20 18:06:01 | 显示全部楼层    本楼为最佳答案   
andreahhhhhh 发表于 2025-02-20 18:03
FishC 发表于 2025-2-20 17:56
上段代码中这句:

...


要实现 `Car_General` 类中的参数 `bonus`, `insurance`, `loss`, `adiscount` 具有默认值,并且在对象无相应参数传入时使用默认值,你只需要在实例化对象时正确传递这些参数即可。

首先确保 `Car_General` 类的构造函数设置了默认值:

  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
复制代码


接下来,在 `register` 方法中,需要根据不同的车辆类型传递相应的参数。如果没有提供相应参数,则使用默认值:

  1. def register(self):
  2.     sort_ = int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
  3.     num = int(input('请输入需要录入的数量:'))
  4.    
  5.     for i in range(num):
  6.         print(f'请录入第{i+1}辆车\n')
  7.         brand = input('品牌:')
  8.         model = input('型号:')
  9.         platenum = input('车牌:')
  10.         dayrent = int(input('租金:'))

  11.         if sort_ == 1:  # 经济型车
  12.             bonus = int(input('补贴:'))
  13.             carid = self.carid1
  14.             self.carid1 += 1
  15.             c = Car_General(carid, brand, model, platenum, dayrent, bonus=bonus)

  16.         elif sort_ == 2:  # 豪华车
  17.             insurance = int(input('保险:'))
  18.             carid = self.carid2
  19.             self.carid2 += 1
  20.             c = Car_General(carid, brand, model, platenum, dayrent, insurance=insurance)

  21.         elif sort_ == 3:  # 跑车
  22.             loss = int(input('损耗:'))
  23.             carid = self.carid3
  24.             self.carid3 += 1
  25.             c = Car_General(carid, brand, model, platenum, dayrent, loss=loss)

  26.         elif sort_ == 4:  # SUV
  27.             carid = self.carid4
  28.             self.carid4 += 1
  29.             c = Car_General(carid, brand, model, platenum, dayrent, adiscount=1)

  30.         # 记录到库存
  31.         self.cars[carid] = c
  32.         self.stocks.append(c)
复制代码


这样,如果在创建对象时没有传递相应的参数,则使用默认值。为了完整性,请确保 `stocks` 和 `cars` 使用合适的数据结构存储数据。例如,可以使用列表和字典:

  1. class CarOperation:
  2.     cars = {}
  3.     stocks = []

  4.     carid1 = 10000
  5.     carid2 = 20000
  6.     carid3 = 30000
  7.     carid4 = 40000

  8.     def operate(self):
  9.         print('欢迎使用鱼C汽车租赁程序\n')
  10.         while True:
  11.             op = int(input('1.录入汽车;2.租车服务;3.还车服务;4.退出程序:\n'))
  12.             if op == 1:
  13.                 self.register()
  14.             elif op == 2:
  15.                 self.rent_car()
  16.             elif op == 3:
  17.                 self.return_car()
  18.             elif op == 4:
  19.                 break

  20.     def register(self):
  21.         sort_ = int(input('1.经济型车;2.豪华车;3.跑车;4.SUV:'))
  22.         num = int(input('请输入需要录入的数量:'))

  23.         for i in range(num):
  24.             print(f'请录入第{i+1}辆车\n')
  25.             brand = input('品牌:')
  26.             model = input('型号:')
  27.             platenum = input('车牌:')
  28.             dayrent = int(input('租金:'))

  29.             if sort_ == 1:  # 经济型车
  30.                 bonus = int(input('补贴:'))
  31.                 carid = self.carid1
  32.                 self.carid1 += 1
  33.                 c = Car_General(carid, brand, model, platenum, dayrent, bonus=bonus)

  34.             elif sort_ == 2:  # 豪华车
  35.                 insurance = int(input('保险:'))
  36.                 carid = self.carid2
  37.                 self.carid2 += 1
  38.                 c = Car_General(carid, brand, model, platenum, dayrent, insurance=insurance)

  39.             elif sort_ == 3:  # 跑车
  40.                 loss = int(input('损耗:'))
  41.                 carid = self.carid3
  42.                 self.carid3 += 1
  43.                 c = Car_General(carid, brand, model, platenum, dayrent, loss=loss)

  44.             elif sort_ == 4:  # SUV
  45.                 carid = self.carid4
  46.                 self.carid4 += 1
  47.                 c = Car_General(carid, brand, model, platenum, dayrent, adiscount=1)

  48.             # 记录到库存
  49.             self.cars[carid] = c
  50.             self.stocks.append(c)
复制代码


这样,当实例化 `Car_General` 时,如果不传递 `bonus`, `insurance`, `loss`, `adiscount` 等参数,会使用默认值。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-13 23:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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