说到继承,你一定会联想到继承你老爸的家产之类的。
类的继承也是一样。
比如有一个旧类,是可以算平均数的。然后这时候有一个新类,也要用到算平均数,那么这时候我们就可以使用继承的方式。新类继承旧类,这样子新类也就有这个功能了。
通常情况下,我们叫旧类为父类,新类为子类。
首先我们来看下类的继承的基本语法:
classClassName(BaseClassName): <statement-1> . . . <statement-N>
在定义类的时候,可以在括号里写继承的类,如果不用继承类的时候,也要写继承 object 类,因为在 Python 中 object 类是一切类的父类。
当然上面的是单继承,Python 也是支持多继承的,具体的语法如下:
classClassName(Base1,Base2,Base3): <statement-1> . . . <statement-N>
多继承有一点需要注意的:若是父类中有相同的方法名,而在子类使用时未指定,python 在圆括号中父类的顺序,从左至右搜索 , 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
那么继承的子类可以干什么呢?
继承的子类的好处:
- 会继承父类的属性和方法
- 可以自己定义,覆盖父类的属性和方法
一个类继承了父类后,可以直接调用父类的方法的,比如下面的例子,UserInfo2
继承自父类 UserInfo
,可以直接调用父类的 get_account
方法。
#!/usr/bin/env python# -*- coding: UTF-8 -*-classUserInfo(object): lv=5def__init__(self, name, age, account): self.name=nameself._age=ageself.__account=accountdefget_account(self): returnself.__accountclassUserInfo2(UserInfo): passif__name__=='__main__': userInfo2=UserInfo2('两点水', 23, 347073565); print(userInfo2.get_account())
当然,也可以重写父类的方法。
示例:
#!/usr/bin/env python3# -*- coding: UTF-8 -*-classUserInfo(object): lv=5def__init__(self, name, age, account): self.name=nameself._age=ageself.__account=accountdefget_account(self): returnself.__account@classmethoddefget_name(cls): returncls.lv@propertydefget_age(self): returnself._ageclassUserInfo2(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())
最后打印的结果:
这里就是重写了父类的构造函数。
对于 class 的继承关系来说,有些时候我们需要判断 class 的类型,该怎么办呢?
可以使用 isinstance()
函数,
一个例子就能看懂 isinstance()
函数的用法了。
#!/usr/bin/env python3# -*- coding: UTF-8 -*-classUser1(object): passclassUser2(User1): passclassUser3(User2): passif__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))
输出的结果如下:
True True True True True False
可以看到 isinstance()
不仅可以告诉我们,一个对象是否是某种类型,也可以用于基本类型的判断。