15779327169 发表于 2024-4-15 10:10:08

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

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() ,这里是否一定要传入参数? 有什么办法直接实例化一个对象,不需要在括号里加入参数?

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 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()

15779327169 发表于 2024-4-15 12:43:08

jackz007 发表于 2024-4-15 10:31
只要为 __init__() 新增可选参数即可解决问题。

收到!原来要传入一个默认值,感谢大神 我悟了

jackz007 发表于 2024-4-15 13:55:52

15779327169 发表于 2024-4-15 12:43
收到!原来要传入一个默认值,感谢大神 我悟了

       你这是求助贴,如果问题得到了解决,应该选出“最佳答案”,求助应该有始有终。

15779327169 发表于 2024-4-15 14:55:22

jackz007 发表于 2024-4-15 13:55
你这是求助贴,如果问题得到了解决,应该选出“最佳答案”,求助应该有始有终。

好嘞!
页: [1]
查看完整版本: [课后作业] 第037讲:类和对象:面向对象编程 | 课后测试题及答案 动动手第0题求助