课程名称:Python3 进阶教程(新版)
章节名称:第3章 Python类的继承
讲师名称:咚咚呛
课程内容
- 继承类
- 判断类型
- 多态
- 多重继承
- 获取对象信息
学习收获
继承类
继承:新类不需要重头编写,继承父类所有的属性、功能,子类只需要实现缺少的新功能。
在定义继承类的时候,有几点是需要注意的:
-
在定义子类的时候,需要在括号内写明继承的父类的类名。
-
在
__init__()
方法,需要调用super(子类名, self).__init__(name, gender)
,来初始化从父类继承过来的属性。
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
class Teacher(Person):
def __init__(self,name,age,course):
super(Teacher,self).__init__(name,age)
self.course = course
lee = Teacher('lee','24','English')
print(lee.course,lee.name)
判断类型
通过函数isinstance()
可以判断一个变量的类型。
在一条继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法。
在一条继承链上,一个实例可以看成它本身的类型,也可以看成它父类的类型。
class Animal:
def __init__(self,name,age):
self.name = name
self.age = age
class Dog(Animal):pass
class Cat(Animal):pass
dog = Dog('huahua',2)
cat = Cat('kitty',3)
print(isinstance(dog,Dog)) # ==> True
print(isinstance(dog,Animal)) # ==> True
print(isinstance(dog,object)) # ==> True
print(isinstance(dog,Cat)) # ==> False
多态
从基类派生出的子类,重写了基类中的方法,这种行为叫做多态。
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def who(self):
return 'I am a Person, my name is %s' % self.name
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def who(self):
return 'I am a Student, my name is %s' % self.name
class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
def who(self):
return 'I am a Teacher, my name is %s' % self.name
从定义上来讲,Student和Teacher都拥有来自父类Person继承的who()方法,以及自己定义的who()方法。但是在实际调用的时候,会首先查找自身的定义,如果自身有定义,则优先使用自己定义的函数;如果没有定义,则顺着继承链向上找。
多重继承
除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。多重继承和单继承没有特别大的差异,只是在括号内加入多个需要继承的类的名字即可。
class Person:pass
class Student(Person):pass
class Teacher(Person):pass
class SkillMixin:pass
class BasketballMixin(SkillMixin):pass
class FootballMixin(SkillMixin):pass
class StudentBasketball(Student,BasketballMixin):
def __init__(self):
print('I am a student and I can play basketball')
class TeacherFootball(Teacher,FootballMixin):
def __init__(self):
print('I am a teacher and I can play football')
s = StudentBasketball()
t = TeacherFootball()
实践证明,在多重继承里,某一基类虽然被继承了多次,但是__init__()
的方法只调用一次。
多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。
获取对象信息
通过type()
函数,可以获得变量的类型。
通过dir()
方法,可以获取变量的所有属性。在dir
列出的属性中,有很多是以下划线开头和结尾的,这些都是特殊的方法,称为内建方法。
如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr()
和 setattr( )
函数了。
方法参数前面加一个星号代表传入的参数存储为一个数组(tuple),两个星号就是字典(dict)