建议一个py文件下只写一个类
先写一个父类:
class Human():
sum = 0
def __init__(self,name,age):
self.name = name
self.age = age
def get_name(self):
print(self.name)
再写一个子类继承这个父类:
from c3 import Human
class Student(Human):
def do_homework(self):
print('english homework')
student1 = Student('小明', 18)
print(student1.sum)
print(Student.sum)
print(student1.name)
print(student1.age)
student1.get_name()
运行结果
0
0
小明
18
小明
说明子类继承了父类的变量(包括类变量和实例变量)和方法
Python支持多继承,一个子类可以继承多个父类,其他语言都是单继承
上边这种情况,子类没有自己特有的变量,一般情况下不会出现这种没有意义的子类,下面我们来修改一下子类,增加一个子类特有的变量school:
from c3 import Human
class Student(Human):
def __init__(self, school, name, age):
self.school = school
Human.__init__(self, name, age)
def do_homework(self):
print('english homework')
if __name__ == "__main__":
student1 = Student('清华大学', '小明', 18)
print(student1.name)
print(student1.age)
print(student1.school)
直接引用了父类的构造函数,但注意
Human.__init__(self, name, age)
不可以写为
Human.__init__(name, age)
不然会报错
Traceback (most recent call last):
File "c2.py", line 13, in <module>
student1 = Student('清华大学', '小明', 18)
Human.__init__(name, age)
TypeError: __init__() missing 1 required positional argument: 'age'
为什么呢?因为Human.__init__(name, age)相当于直接用类Human来调用了构造函数,通常我们是实例化之后再调用的,因此,使用类直接调用方法时,参数需要加上self,我们可以通过子类的方法do_homework试验一下
from c3 import Human
class Student(Human):
def __init__(self, school, name, age):
self.school = school
Human.__init__(self, name, age)
def do_homework(self):
print('english homework')
if __name__ == "__main__":
student1 = Student('清华大学', '小明', 18)
Student.do_homework()
运行报错:
Traceback (most recent call last):
File "c2.py", line 21, in <module>
Student.do_homework()
TypeError: do_homework() missing 1 required positional argument: 'self'
但是直接调用父类的构造函数的方式很奇怪,因为一个类调用了一个实例方法,不符合面向对象的原则,此处能够调用体现了Python的灵活性,但是不要这么使用
为了实现更换所继承的父类时,不修改过多子类内部代码
上方的Human.__init__(self, name, age)不推荐使用,而是应该使用super
from c3 import Human
class Student(Human):
def __init__(self, school, name, age):
self.school = school
super(Student, self).__init__(name, age)
def do_homework(self):
print('english homework')
if __name__ == "__main__":
student1 = Student('清华大学', '小明', 18)
print(student1.name)
print(student1.age)
print(student1.school)
运行结果
小明
18
清华大学
子类除了可以调用父类的构造方法,还可以调用父类的其他方法,下面给父类Human增加一个方法与子类Student同名的方法do_homework:
class Human():
sum = 0
def __init__(self,name,age):
self.name = name
self.age = age
def get_name(self):
print(self.name)
def do_homework(self):
print('This is a parent method')
from c3 import Human
class Student(Human):
def __init__(self, school, name, age):
self.school = school
super(Student, self).__init__(name, age)
def do_homework(self):
print('english homework')
if __name__ == "__main__":
student1 = Student('清华大学', '小明', 18)
student1.do_homework()
运行结果
english homework
可见,当父类方法和子类方法同名时(Python是允许的,不会报错),优先调用子类的方法,下面我们在子类的do_homework方法中调用父类的do_homework方法:
from c3 import Human
class Student(Human):
def __init__(self, school, name, age):
self.school = school
# Human.__init__(self, name, age)
super(Student, self).__init__(name, age)
def do_homework(self):
super(Student, self).do_homework()
print('english homework')
if __name__ == "__main__":
student1 = Student('清华大学', '小明', 18)
student1.do_homework()
运行结果
This is a parent method
english homework
网友评论