鱼C论坛

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

[已解决]代码求助

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

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

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

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
最佳答案
3 天前
andreahhhhhh 发表于 2025-02-20 18:03
FishC 发表于 2025-2-20 17:56
上段代码中这句:

...


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

首先确保 `Car_General` 类的构造函数设置了默认值:
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

接下来,在 `register` 方法中,需要根据不同的车辆类型传递相应的参数。如果没有提供相应参数,则使用默认值:
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=bonus)

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

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

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

        # 记录到库存
        self.cars[carid] = c
        self.stocks.append(c)

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

    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()
            elif op == 2:
                self.rent_car()
            elif op == 3:
                self.return_car()
            elif 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=bonus)

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

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

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

            # 记录到库存
            self.cars[carid] = c
            self.stocks.append(c)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

以下是修改后的代码:
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
        return self.day * (self.dayrent - self.bonus + self.insurance + self.loss) * self.adiscount


class EconomyCar(Car_General):
    pass


class LuxuryCar(Car_General):
    pass


class SportsCar(Car_General):
    pass


class SUV(Car_General):
    pass


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

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

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

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

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

        print(f'4.SUV(租赁超过7天,享有额外折上7折优惠),共有{len(self.stocks["SUV"])}辆。\n')
        for each in self.stocks["SUV"]:
            print(f'车辆编号:{each.get_carid()},品牌:{each.get_brand()},型号:{each.get_model()},日租金:{each.get_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])
        elif str(idins).startswith('2'):
            self.stocks["LuxuryCar"].remove(self.cars[idins])
        elif str(idins).startswith('3'):
            self.stocks["SportsCar"].remove(self.cars[idins])
        elif str(idins).startswith('4'):
            if day > 7:
                total *= 0.7
            self.stocks["SUV"].remove(self.cars[idins])

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

    def return_car(self):
        idins = int(input('请输入车辆编号:'))
        if str(idins).startswith('1'):
            self.stocks["EconomyCar"].append(self.cars[idins])
        elif str(idins).startswith('2'):
            self.stocks["LuxuryCar"].append(self.cars[idins])
        elif str(idins).startswith('3'):
            self.stocks["SportsCar"].append(self.cars[idins])
        elif str(idins).startswith('4'):
            self.stocks["SUV"].append(self.cars[idins])

# 运行操作界面
operation = CarOperation()
operation.operate()

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

方法中的参数支持默认值吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

以下是一个示例:
class Example:
    def greet(self, name="鱼油", message="你好呀!"):
        print(f"{name},{message}")

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

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

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

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

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

正确写法为:
def example_func(name, message="你好"):  # 正确
    pass

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
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)这一句有问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


上段代码中这句:
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` 方法中,根据选择的车辆类型,应该实例化具体的子类,并正确传入所需的参数。
if sort_ == 1:  # 经济型车
    bonus = int(input('补贴:'))
    carid = self.carid1
    self.carid1 += 1
    c = EconomyCar(carid, brand, model, platenum, dayrent, bonus=bonus)

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

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

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

---

#### 修复子类的 `__init__`
确保每个子类在初始化时能够正确继承父类的属性,同时增加其特有的属性。这里可以通过调用父类的 `__init__` 方法来简化逻辑,例如:
class EconomyCar(Car_General):
    def __init__(self, carid, brand, model, platenum, dayrent, bonus=0):
        super().__init__(carid, brand, model, platenum, dayrent, bonus=bonus)

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

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

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

---

### 最终正确的 `register` 方法
结合上述修正,完整的 `register` 方法如下:
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=bonus)

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

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

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

        # 记录到库存
        self.cars[carid] = c
        self.stocks.append(c)

---

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
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等我想实现为设置默认值,当对象无相应参数传入时,使用默认值,该如何修改?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

...


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

首先确保 `Car_General` 类的构造函数设置了默认值:
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

接下来,在 `register` 方法中,需要根据不同的车辆类型传递相应的参数。如果没有提供相应参数,则使用默认值:
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=bonus)

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

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

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

        # 记录到库存
        self.cars[carid] = c
        self.stocks.append(c)

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

    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()
            elif op == 2:
                self.rent_car()
            elif op == 3:
                self.return_car()
            elif 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=bonus)

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

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

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

            # 记录到库存
            self.cars[carid] = c
            self.stocks.append(c)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 14:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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