当有相同的属性或者方法是this子类表示调用自己的属性或者方法,
super调用父类的属性或者方法。
当子类调用的属性方法在子类中不存在时,那么this和super都是调用父类的属性或者方法
1.方式一
子类调用父类的方法,包含2中形式的调用。一种形式是在类内部通过继承的方式调用父类的方法,另外一种形式是子类实例化后之后通过继承的方式来调用父类的方法。如下图所示:
注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己));而实例在通过继承调用父类的属性或方法时,则不用传self参数,因为实例已经实例化了呀!!!
该部分的代码块如下:注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己));而实例在通过继承调用父类的属性或方法时,则不用传self参数,因为实例已经实例化了呀!!!
该部分的代码块如下:
class Person():
"人的类"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print("%s开始吃饭了"%self.name)
class Student(Person):
"学生类"
def __init__(self,name,age,sex,classnaem):
#子类调用父类的构造函数进行初始化
Person.__init__(self,name,age,sex) #通过子类把参数传给父类(self不能少,self只有在实例化和实例调用类时才能省略,此处不是)
self.classnaem = classnaem
def course(self):
print("%s在%s上课"%(self.name,self.classnaem))
def done(self):
print("这个学生在干嘛?")
#子类调用父类方法
Person.eat(self) #子类在调用父类方法必须要传self
#实例化一个子类
student = Student("周明",23,'男',"11届土木3班")
#调用子类本身的方法
student.course()
#通过子类调用父类的方法--->实例化之后来调用父类的方法
student.eat()
#调用子类的方法,在子类方法中调用了子类的方法,与student.eat有区别
student.done()
此时如果父类的名称更改了,那么在子类中所有用到父类名的地方均要进行修改了。所有此种方法不便于后期维护,为此我们选择方式二。
2.方式二
使用super来代替父类名,以方便代码的后期维护,见下图:
使用super的好处,一是可以代替父类名,这样后期父类名更改了,我们只需要更改子类名称后面的父类名即可,子类中其他的父类名可以不用更改;二是使用了super后,调用父类方法时可以不传参数self。
该部分的代码块为:
class Person():
"人的类"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print("%s开始吃饭了"%self.name)
class Student(Person):
"学生类"
def __init__(self,name,age,sex,classnaem):
#子类调用父类的构造函数进行初始化
# Person.__init__(self,name,age,sex) #通过子类把参数传给父类(self不能少,self只有在实例化和实例调用类时才能省略,此处不是)
#使用super来替换父类名
super().__init__(name,age,sex) #通过子类把参数传给父类,用super可以省略self
self.classnaem = classnaem
def course(self):
print("%s在%s上课"%(self.name,self.classnaem))
def done(self):
print("这个学生在干嘛?")
#子类调用父类方法
super().eat() #子类在调用父类方法,使用super可以省略self
#实例化一个子类
student = Student("周明",23,'男',"11届土木3班")
#调用子类本身的方法
student.course()
#通过子类调用父类的方法--->实例化之后来调用父类的方法
student.eat()
#调用子类的方法,在子类方法中调用了子类的方法,与student.eat有区别
student.done()
参考:https://www.cnblogs.com/a8457013/p/8438490.html