大家好,我是天空之城,今天给大家带来小福利,python中子类继承父类的一些注意点
class Person:
def __init__(self):
self.name = "jack"
class Student(Person):
def __init__(self):
super(Student, self).__init__() #这一行不可以省略
self.name='tom'
self.school = "一中"
stu = Student()
print("学生的姓名是:",stu.name)
在上面这段代码中,子类中super(Student, self).__init__() #这一行不可以省略,因为如果子类中有同名方法就会覆盖父类的方法,父类的方法和属性彻底不可用,也就没有必要继承父类了。
所以这里就需要调用一下父类的方法,子类才能够继承父类的所有属性和方法,在此基础上,子类进行重写,才会使得能够调用子类自己定义的方法,同时可以调用没有改写的父类的方法。
如果不是同名方法,省略了这一行,那么调用的就是父类的属性和方法,而不是子类定义的属性和方法,除非直接调用子类自己定义的方法,详情见下图。
子类重写父类init方法,重新定义了属性
这里子类方法覆盖了父类的方法
下面直接报错了,子类覆盖父类方法,并且子类没有重新定义属性,
这里把子类方法名改成了hehe,与init不重名,子类直接继承父类的属性
这里没有调用父类的init方法,导致子类自己定义的属性也没法使用,还是代用的父类的属性和方法
子类直接继承父类属性,不管有没有代用父类的init方法
子类即使改写name属性也不成功,因为hehe方法与父类的init方法不同
只有直接调用子类定义的hehe方法才行,子类定义的属性才有用
这样就改写成功了
如果不调用子类的hehe方法,还是显示父类的属性
只有这样才能调用子类自己定义的属性和方法
或者这样
如果子类没有改写,那么就直接调用父类的属性了
如果也没有调用父类方法,那么就直接报错了
这里没有调用父类的init方法,子类直接改写name属性,也是可以的
相信经过以上的对比,大家应该能明白了。