# 七、类的继承 # ## 1、定义类的继承 ## 说到继承,你一定会联想到继承你老爸的家产之类的。 类的继承也是一样。 比如有一个旧类,是可以算平均数的。然后这时候有一个新类,也要用到算平均数,那么这时候我们就可以使用继承的方式。新类继承旧类,这样子新类也就有这个功能了。 通常情况下,我们叫旧类为父类,新类为子类。 首先我们来看下类的继承的基本语法: ```python class ClassName(BaseClassName): . . . ``` 在定义类的时候,可以在括号里写继承的类,如果不用继承类的时候,也要写继承 object 类,因为在 Python 中 object 类是一切类的父类。 当然上面的是单继承,Python 也是支持多继承的,具体的语法如下: ```python class ClassName(Base1,Base2,Base3): . . . ``` 多继承有一点需要注意的:若是父类中有相同的方法名,而在子类使用时未指定,python 在圆括号中父类的顺序,从左至右搜索 , 即方法在子类中未找到时,从左到右查找父类中是否包含方法。 那么继承的子类可以干什么呢? 继承的子类的好处: * 会继承父类的属性和方法 * 可以自己定义,覆盖父类的属性和方法 ## 2、调用父类的方法 ## 一个类继承了父类后,可以直接调用父类的方法的,比如下面的例子,`UserInfo2` 继承自父类 `UserInfo` ,可以直接调用父类的 `get_account` 方法。 ```python #!/usr/bin/env python # -*- coding: UTF-8 -*- class UserInfo(object): lv = 5 def __init__(self, name, age, account): self.name = name self._age = age self.__account = account def get_account(self): return self.__account class UserInfo2(UserInfo): pass if __name__ == '__main__': userInfo2 = UserInfo2('两点水', 23, 347073565); print(userInfo2.get_account()) ``` ## 3、父类方法的重写 ## 当然,也可以重写父类的方法。 示例: ```python #!/usr/bin/env python3 # -*- coding: UTF-8 -*- class UserInfo(object): lv = 5 def __init__(self, name, age, account): self.name = name self._age = age self.__account = account def get_account(self): return self.__account @classmethod def get_name(cls): return cls.lv @property def get_age(self): return self._age class UserInfo2(UserInfo): def __init__(self, name, age, account, sex): super(UserInfo2, self).__init__(name, age, account) self.sex = sex; if __name__ == '__main__': userInfo2 = UserInfo2('两点水', 23, 347073565, '男'); # 打印所有属性 print(dir(userInfo2)) # 打印构造函数中的属性 print(userInfo2.__dict__) print(UserInfo2.get_name()) ``` 最后打印的结果: ![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-09-Python%20%E7%B1%BB%E7%9A%84%E7%BB%A7%E6%89%BF.png) 这里就是重写了父类的构造函数。 ## 4、子类的类型判断 ## 对于 class 的继承关系来说,有些时候我们需要判断 class 的类型,该怎么办呢? 可以使用 `isinstance()` 函数, 一个例子就能看懂 `isinstance()` 函数的用法了。 ```python #!/usr/bin/env python3 # -*- coding: UTF-8 -*- class User1(object): pass class User2(User1): pass class User3(User2): pass if __name__ == '__main__': user1 = User1() user2 = User2() user3 = User3() # isinstance()就可以告诉我们,一个对象是否是某种类型 print(isinstance(user3, User2)) print(isinstance(user3, User1)) print(isinstance(user3, User3)) # 基本类型也可以用isinstance()判断 print(isinstance('两点水', str)) print(isinstance(347073565, int)) print(isinstance(347073565, str)) ``` 输出的结果如下: ```txt True True True True True False ``` 可以看到 `isinstance()` 不仅可以告诉我们,一个对象是否是某种类型,也可以用于基本类型的判断。