nettkd 发表于 2022-2-22 07:05:40

关于类的重写的问题

各位大佬,我遇到一个问题,是说:完成子类定制,使运行结果为:“雷猴,欢迎来到广东!”
class Chinese:
    def __init__(self, greeting='你好', place='中国'):
      self.greeting = greeting
      self.place = place

    def greet(self):
      print('%s!欢迎来到%s。' % (self.greeting, self.place))


class Cantonese(Chinese):
   #此处填写代码

yewen = Cantonese()
yewen.greet()




我的答案是:
def __init__(self):
      Chinese.__init__(self,greeting='雷猴',place='广东')

标准答案是:
def __init__(self, greeting = '雷猴', place = '广东'):
      Chinese.__init__(self, greeting, place)

两者运行后都能达到最终目的,我想问这两种写法有什么不一样吗?我会不会错了,只是凑巧在这个题目里面刚好对了?

isdkz 发表于 2022-2-22 07:10:53

本帖最后由 isdkz 于 2022-2-22 07:12 编辑

你的答案的初始化方法里面没有greeting和place这两个参数,
也就是说你的类在实例化的时候没法手动传入这两个参数对实例进行定制,
而标准答案就不会有这种问题

isdkz 发表于 2022-2-22 07:27:25

本帖最后由 isdkz 于 2022-2-22 07:28 编辑

isdkz 发表于 2022-2-22 07:10
你的答案的初始化方法里面没有greeting和place这两个参数,
也就是说你的类在实例化的时候没法手动传入这 ...

就比如说现在他想要一个新的实例,这个新的实例的greetf方法输出 “石猴!欢迎来到北京”,
注意,是一个新的实例,不是一个新的类。

因为你的答案的__init__方法中没法手动传入greeting,place属性,所以需要在类实例化后再对属性进行更改,
所以你的只能这么写
class Chinese:
    def __init__(self, greeting='你好', place='中国'):
      self.greeting = greeting
      self.place = place

    def greet(self):
      print('%s!欢迎来到%s。' % (self.greeting, self.place))


class Cantonese(Chinese):
    def __init__(self):
      Chinese.__init__(self,greeting='雷猴',place='广东')

# 注意下面这几行
shihou = Cantonese()
shihou.greeting = '石猴'
shihou.place = '北京'
shihou.greet()

而标准答案可以在初始化方法中传入greeting,place,所以标准答案那种只需要在实例化时候传入greeting,place就行
class Chinese:
    def __init__(self, greeting='你好', place='中国'):
      self.greeting = greeting
      self.place = place

    def greet(self):
      print('%s!欢迎来到%s。' % (self.greeting, self.place))


class Cantonese(Chinese):
    def __init__(self, greeting = '雷猴', place = '广东'):
      Chinese.__init__(self, greeting, place)

# 注意下面这几行
shihou = Cantonese('石猴', '北京')
shihou.greet()

nettkd 发表于 2022-2-22 08:52:25

isdkz 发表于 2022-2-22 07:27
就比如说现在他想要一个新的实例,这个新的实例的greetf方法输出 “石猴!欢迎来到北京”,
注意,是 ...

哦哦,好像是有点感觉了,也就是说在子类定制的时候,应该是对子类的函数参数进行定制吗?

isdkz 发表于 2022-2-22 08:55:05

本帖最后由 isdkz 于 2022-2-22 08:57 编辑

nettkd 发表于 2022-2-22 08:52
哦哦,好像是有点感觉了,也就是说在子类定制的时候,应该是对子类的函数参数进行定制吗?

你那种写法就不能在类实例化的时候对实例进行定制,因为你的初始化方法没有接收初始化的参数,

而标准答案可以在类实例化的时候手动传入参数替换掉默认参数来对类的实例进行定制

nettkd 发表于 2022-2-22 14:44:36

isdkz 发表于 2022-2-22 07:27
就比如说现在他想要一个新的实例,这个新的实例的greetf方法输出 “石猴!欢迎来到北京”,
注意,是 ...

你好,在另外 一个例子中,

class Student:
    def __init__(self, name, job=None, time=0.00, time_effective=0.00):
      self.name = name
      self.job = job
      self.time = time
      self.time_effective = time_effective

    def count_time(self, hour, rate):
      self.time += hour
      self.time_effective = hour * rate

# 请你完成子类的定制(包括初始化方法和count_time函数)
class Programmer(Student):



# 通过两个实例,完成子类和父类的对比(可自行验证)
student1 = Student('韩梅梅')
student2 = Programmer('李雷')



标准答案是:
class Programmer(Student):
    def __init__(self, name):
      Student.__init__(self, name, job='programmer', time=0.00, time_effective=0.00)#??????

    def count_time(self, hour, rate=1):
      Student.count_time(self, hour, rate)
我的疑问是为什么我的第一个问题里,是在子类的初始化方法里面设置参数(greeting='雷猴',place='广东')
而在这个里面,却是在父类.__init__后面设置参数呢?困扰我好久了

isdkz 发表于 2022-2-22 14:51:25

nettkd 发表于 2022-2-22 14:44
你好,在另外 一个例子中,

class Student:


因为你的子类是 Programmer ,programmer 的job(职业)肯定是 programmer,

所以在子类programmer中不允许对job进行定制,只允许对name进行定制,所以子类的初始化方法里面只允许传入参数name,

而职业信息调用父类的初始化方法来初始化
页: [1]
查看完整版本: 关于类的重写的问题