鱼C论坛

 找回密码
 立即注册
查看: 389|回复: 5

[已解决][课后作业] 第037讲:类和对象:面向对象编程 | 课后测试题及答案 动动手第0题求助

[复制链接]
发表于 2024-4-15 10:10:08 | 显示全部楼层 |阅读模式

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

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

x
class Tickets:
    adult_price = 100
    now_adult = 120
    child_price =50
    new_child = 60
    def __init__(self,adult,child):
        self.adult = adult
        self.child = child
    def date_money(self):
        day = input('请输入是否为工作日:Yes/No')
        self.adult = int(input('请输入成年人数量:'))
        self.child = int(input('请输入小孩数量:'))
        if day == 'YES' or 'Yes' or 'yeS' or 'yES':
            sun =   self.adult_price * self.adult + self.child_price *  self.child
            print('%d个成年人和%d个小孩的票价总计为:'%(self.adult,self.child)+ str(sun))
        else:
            sun = self.now_adult * self.adult + self.new_child * self.child
            print('%d个成年人和%d个小孩的票价总计为:' % (self.adult, self.child) + str(sun))

price1= Tickets()
price1.date_money()

1、请问,为什么我这个    def __init__(self,adult,child):会显示:
TypeError: __init__() missing 2 required positional arguments: 'adult' and 'child' 这个错误
2、初始化函数在什么情况下使用?
3、定义了一个类并且初始化_init__参数之后,在实例化对象后是否一定要传入参数?如:  
class Tickets:
    def __init__(self,adult,child):
        self.adult = adult
        self.child = child
price1= Tickets() ,这里是否一定要传入参数? 有什么办法直接实例化一个对象,不需要在括号里加入参数?
最佳答案
2024-4-15 10:31:22
本帖最后由 jackz007 于 2024-4-15 12:08 编辑

        只要为 __init__() 新增可选参数即可解决问题。
class Tickets:
    adult_price = 100
    now_adult = 120
    child_price = 50
    new_child = 60
    sun = False
    def __init__(self , adult = 120 , child = 60 , sun = False):  # 为 __init__() 增加 3 个可选参数
        self . adult = adult    # 如果不指定,那么,self . adult 的缺省值是 120
        self . child = child    # 如果不指定,那么,self . child 的缺省值是  60
        self . sun = sun        # 如果不指定,那么,self . sun   的缺省值是  False (也就是工作日)
    def date_money(self):
        if self . sun :
            sun = self . adult_price * self . adult + self . child_price *  self . child
            print('%d个成年人和 %d个小孩非工作日的票价总计为:' % (self . adult , self . child) + str(sun))
        else:
            sun = self . now_adult * self . adult + self . new_child * self . child
            print('%d个成年人和%d个小孩工作日的票价总计为:' % (self . adult , self . child) + str(sun))

price1 = Tickets()                                        # 用缺省值新建 Tickets 的对象 price1
price1 . date_money()
price2 = Tickets(30 , 130)                                # 用 adult = 30 , child = 130 , sun = False 新建  Tickets 的对象 price2
price2 . date_money()
price3 = Tickets(child = 20 ,  sun = True , adult = 10)   # 用 adult = 10 , child = 20 , sun = True 新建  Tickets 的对象 price3
price3 . date_money()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-15 10:10:27 | 显示全部楼层
1. 在你的代码中,初始化函数`__init__(self, adult, child)`需要两个参数`adult`和`child`,但是在实例化对象`price1=Tickets()`时没有传入这两个参数,所以出现了错误提示。为了解决这个问题,你可以在实例化对象时传入参数,如`price1 = Tickets(2, 3)`,其中2表示成年人数量,3表示小孩数量。

2. 初始化函数`__init__`用于对类的实例进行必要的初始化操作。当你创建一个对象时,初始化函数会自动调用,并且它允许你在创建对象时传递参数。

3. 在你的代码中,如果你想实例化一个`Tickets`对象,必须传入`adult`和`child`参数。但是如果你希望有一个默认值或者在实例化对象时不需要传入参数,你可以在初始化函数中给参数设置默认值。例如:
class Tickets:
    def __init__(self, adult=0, child=0):
        self.adult = adult
        self.child = child

price1 = Tickets()

在这个例子中,`adult`和`child`参数都有默认值为0,所以你可以直接实例化一个`Tickets`对象,无需传入参数。

希望这些解答能帮到你!

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

使用道具 举报

发表于 2024-4-15 10:31:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-4-15 12:08 编辑

        只要为 __init__() 新增可选参数即可解决问题。
class Tickets:
    adult_price = 100
    now_adult = 120
    child_price = 50
    new_child = 60
    sun = False
    def __init__(self , adult = 120 , child = 60 , sun = False):  # 为 __init__() 增加 3 个可选参数
        self . adult = adult    # 如果不指定,那么,self . adult 的缺省值是 120
        self . child = child    # 如果不指定,那么,self . child 的缺省值是  60
        self . sun = sun        # 如果不指定,那么,self . sun   的缺省值是  False (也就是工作日)
    def date_money(self):
        if self . sun :
            sun = self . adult_price * self . adult + self . child_price *  self . child
            print('%d个成年人和 %d个小孩非工作日的票价总计为:' % (self . adult , self . child) + str(sun))
        else:
            sun = self . now_adult * self . adult + self . new_child * self . child
            print('%d个成年人和%d个小孩工作日的票价总计为:' % (self . adult , self . child) + str(sun))

price1 = Tickets()                                        # 用缺省值新建 Tickets 的对象 price1
price1 . date_money()
price2 = Tickets(30 , 130)                                # 用 adult = 30 , child = 130 , sun = False 新建  Tickets 的对象 price2
price2 . date_money()
price3 = Tickets(child = 20 ,  sun = True , adult = 10)   # 用 adult = 10 , child = 20 , sun = True 新建  Tickets 的对象 price3
price3 . date_money()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-15 12:43:08 | 显示全部楼层
jackz007 发表于 2024-4-15 10:31
只要为 __init__() 新增可选参数即可解决问题。

收到!原来要传入一个默认值,感谢大神 我悟了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-15 13:55:52 From FishC Mobile | 显示全部楼层
15779327169 发表于 2024-4-15 12:43
收到!原来要传入一个默认值,感谢大神 我悟了

       你这是求助贴,如果问题得到了解决,应该选出“最佳答案”,求助应该有始有终。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-15 14:55:22 From FishC Mobile | 显示全部楼层
jackz007 发表于 2024-4-15 13:55
你这是求助贴,如果问题得到了解决,应该选出“最佳答案”,求助应该有始有终。

好嘞!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 05:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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