2-3编程练习问题

来源:2-3 编程练习

起风了__

2020-02-06 21:35:20

http://img.mukewang.com/climg/5e3c15a309cbc2af05730490.jpg

请问我调用父类的__init__构造方法正确了吗?

并且在Student类中的set_num(new_num)方法,需要更新学号的值,那这个值需要在__init__方法里声明吗?如何声明?

写回答

4回答

好帮手乔木

2020-02-07

同学你好:

1、子类继承父类方法的写法:

super(子类,self).函数(参数1,参数2,....)

super().函数(参数1,参数2,....) 该形式只在python3适用。

还有一种经典写法:

父类名称.函数(self,参数1,参数2,...)

因此同学需要将标注的位置去掉。

http://img.mukewang.com/climg/5e3cd7be0971a6bd04570150.jpg

2、关于num属性,同学可以直接在__init__函数中定义初始化即可。

例如:

http://img.mukewang.com/climg/5e3cd97309b4d2f906470136.jpg

identify_stu()方法是判断学号的。

参考:

http://img.mukewang.com/climg/5e3cd98509fe085d04780139.jpg

参考代码:

class Person(object):
# 重写实例对象的构造(初始化)方法
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
# 自定义实例方法,格式化打印实例属性name的值
    def speak(self):
        print("hello!我是{}".format(self.name))
# 自定义实例方法,占位作用
    def relation(self):
        pass
class Student(Person):
# 重写实例对象的构造(初始化)方法,并调用父类构造方法,实现对实例属性的赋值
    def __init__(self,name,gender,score,major,stu_num=2018014002):
        super(Student,self).__init__(name,gender)
        self.score = score
        self.major = major
        self.num = stu_num
# 自定义实例方法,格式化打印实例属性stu_num的值
    def speak(self):
        super(Student, self).speak()
        print("我的学号为{},很高兴认识大家".format(self.num))
# 自定义实例方法,判断学号是否为既定值,并根据判断结构 进行分类打印
    def identify_stu(self):
        if self.num == 2018014002:
            print("我的分组已经完成")
        else:
            print("请稍后,马上为你自动分组")
# 自定义实例方法,设置实例对象的学号为传入的值
    def set_num(self,new_num):
        self.num = new_num
# 自定义实例方法,判断该类是否为Person类的子类,并进行分类打印
    def relation(self):
        if issubclass(Student,Person):
            print("我的父类是Person")
        else:
            print("父类正在查询中")

如果我解决了同学的问题,请采纳!学习愉快^_^。




1

coffeehyh

2020-02-12

参考  好帮手乔木 的答案就ok了。

调用父类的方法有三种方式,建议直接使用最新、最简单、最方便的方法:

super().方法名(参数1, 参数2...)

用到你这里,就是:

super().__init__(name, gender)


关于stu_num属性的设置,使用默认值参数最方便也最灵活。

即:

def __init__(self, name, gender, score, major, stu_num='2018014002'):

    super().__init__(name, gender)

    self.score = score

    self.major = self.major

    self.stu_num = stu_num


由于这里使用了默认值参数,所以在实例化对象的时候,可以不传入stu_num的值也能正常初始化。

另外,stu_num 的数值类型,建议使用字符串格式,这是因为避免在实际项目中,可能会遇到id号开头为0的情况下,使用整型不方便。







0

为学习而奋斗

2020-02-06

 (2):之前给同学的代码,同学可以看一下,这里我就只截取一部分,在这里的 set_num(self,new_num):方法中的这个参数,传给self.stu_nu,此时,这个值如果变化了下面的判断也就跟着变化,例如小红传入的值是201804062,然后就会将这个数值传入到set_num(self,new_num)中,将这个值赋值给self.stu_nu,然后传回到构造函数里面进行重新赋值,在判断语句中就发生了变化直接的就变成走到else去了,打印的就是else的输出内容,具体的应该是这样子的声明~

def identify_stu(self):
   if self.stu_nu == 2018014002:
       print("我的分组已经完成")
   else:
       print("请稍后,马上为你自动分组")

而小明的是2018014002,应对了上面的if语句,所以执行if语句的话~

0

为学习而奋斗

2020-02-06

同学,您好:

def __init__(self , name , gender , score , major):
   super(Student,self).__init__(name,gender)#在父类已经实例化该方法,只需要实例化子类的属性值
   self.score = score
   self.major = major
   self.stu_nu = 2018014002

(1):同学可以参考我以上的代码,当然之前同学的那个代码也是正确的,当然调用父类的方法有很多种

同学这里使用了两种的调用方法,其实只需要super这个方法就可以了,因为他的依赖于它的父类,所以,同学可以使用这个 super(Student,self).__init__(name,gender)跟我的这个一样就OK~当然都是可以 的只不过不需要同时出两个调用父类的方法,就是super(Person,self)和Person.__init__(name,gender)

一种就可以了~而且,同学的super(Student,self)应该在后面再补上.__init__()然后里面传入父类有的参数即可,而且这个super(Student,self)里面的应该是子类加self才对,不是父类加self,同学要弄清楚哟~

def __init__(self , name , gender , score , major):
   super(Student,self).__init__(name,gender)#在父类已经实例化该方法,只需要实例化子类的属性值
   self.score = score
   self.major = major
   self.stu_nu = 2018014002

def set_num(self,new_num):
   self.stu_nu = new_num

 (2):之前给同学的代码,同学可以看一下,这里我就只截取一部分,在这里的 set_num(self,new_num):方法中的这个参数,传给self.stu_nu,此时,这个值如果变化了下面的判断也就跟着变化,例如小红传入的值是201804062,然后他就会把值传给self.stu_num之后发生改变判断语句,具体的应该是这样子的声明~

def identify_stu(self):
   if self.stu_nu == 2018014002:
       print("我的分组已经完成")
   else:
       print("请稍后,马上为你自动分组")

也就变成了else:输入下面的内容,而小明的是2018014002,应对了上面的if语句,所以执行if语句的话~

0

0 学习 · 8160 问题

查看课程