Python面向对象 学习笔记(三)
目录
类的继承(补充)和多态
一个类继承另一个类时,会自动获得另一个类的所有属性和方法,被继承的类称之为父类,新类称为子类。子类拥有父类所有的属性和方法,并且可以定义自己的属性和方法。
一、类的多继承
Python中的类同样有限的支持多继承形式,子类所继承的多个父类在类定义是,依次于括号中列出,用逗号隔开,形式如下:
class Son(Father1,Father2,Father3...):
#类体
这里需要注意的是,如果括号内的父类有同名的方法(子类中不含有该方法),并且子类在使用时未指定,则Python将在这些父类中从左至右搜索,并且默认调用第一个出现的父类的方法。
多继承实例:
class Person:
#定义构造方法
def __init__(self,name,age):
self.name = name
self.age = age
#定义成员方法
def speak(self):
print('%s说:"我今年%d岁。"' %(self.name,self.age))
class Athlete:
def __init__(self,name,sport):
self.name = name
self.sport = sport
def speak(self):
print('我叫%s,我是一名运动员,我擅长的运动是%s'%(self.name,self.sport))
#同时继承两个类
class Student(Athlete,Person):
def __init__(self,name,age,Class,num,sport):
Person.__init__(self,name,age)
Athlete.__init__(self,name,sport)
self.Class = Class
self.num = num
student1 = Student("xiaoming",18,1,"20210129","Basketball")
student1.speak()#由于Person和Athlete类中都有speak()方法,默认的是调用括号中靠前的父类的方法
#此处即调用了Athlete中的speak()方法
运行结果为:
我叫xiaoming,我是一名运动员,我擅长的运动是Basketball
注意事项:
以上代码中若将
“Person.__init__(self,name,age) Athlete.__init__(self,name,sport)”
改为
“super().__init__(name,age) super().__init__(name,sport)”
则将两次调用Athlete类的构造方法。
若想使用Person类中的speak()方法,可在Student类中添加以下代码段:
def speak(self):
Person.speak(self)
二、类的多态性
isinstance()方法:
该方法可用来判断一个变量是不是某个类型,例如:
student1 = Student("xiaoming",18,1,"20210129","Basketball")
person1 = Person("xiaohong",18)
print(isinstance(student1,Student))#True
print(isinstance(student1,Person))#True
print(isinstance(person1,Student))#False
print(isinstance(student1,Person))#True
通过以上代码可以看出,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看作是该子类所继承的父类,而父类的数据类型,却不能被看作是子类。
多态的概念和好处:
多态指的是为不同数据类型的实体提供统一的接口。可通过以下代码加以理解。
实例理解:
class Person:
def speak(self):
print("我是人")
class Teacher(Person):
def speak(self):
print("我是老师")
class Student(Person):
def speak(self):
print("我是学生")
class Parent(Person):
def speak(self):
print("我是家长")
def speaking(individual):
individual.speak()
speaking(Person())
speaking(Teacher())
speaking(Student())
speaking(Parent())
输出为:
我是人
我是老师
我是学生
我是家长
分析:
在该实例中,当我们需要在speaking()方法中传入Teacher、Student等类型时,我们只需要接收Person类型就可以了,因为Teacher、Student等类型都是Person类型的子类,子类可以看作是其父类的类型。之后只需要按照Person类型进行操作即可。
由于Person类型本身含有speak()方法,因此,传入的任意类型,只要是Person类或其子类,都会自动调用相应的speak()方法。
若新定义了一些Person类的子类,也无需修改speaking()方法,就能够正常运行。
这就是多态的好处。
本博客序列号 hhjxxq-5