类的继承
类的继承
基本概念
面向对象三要素之一,继承Inheritance
继承(也叫派生)
class Cat(Animal)这种形式就是从父类继承,括号中写上继承的类的列表.
阶乘可以让字类从父类获取特征(属性和方法)
父类
Animal就是Cat的父类,也称基类,超类.
子类
Cat就是Animal的字类,也称派生类
定义
class 子类名(基类1[,基类2,...]):
语句块
如果类定义时,没有基类列表,等同于继承子object.在Python3中,object类时所有对象的根基类.
class A:
pass
#等价于
class A(object):
pass
查看属性的方法
属性方法 | 含义 |
---|---|
__bases__ |
查看返回类的基类的元组.是类的方法,不会返回爷爷类 |
mro()方法 | 显示方法查找顺序,调用__mro__ ,返回查找顺序列表,是类的方法,实例不能用 |
__subclasses__() |
类的子类列表 |
总结
继承时,公有的,子类和实例都可以随意访问;私有成员被隐藏,子类和实例不可直接访问,当私有变量所在的类内的方法中可以访问这个私有变量.
Python通过自己的一套实现,实现和其他语言一样的面向对象的继承机制.
属性查找顺序
实例的__dict__
-->类__dict__
-->(如果有继承)父类__dict__
这些地方都搜索没找到就会抛异常,先找到就立即返回.
方法的重写,覆盖(override)
同名方法或属性在调用过程中,类似函数执行,前面的属性会被后面的同名属性覆盖.
静态方法和类方法
@staticmethod静态方法
@classmethod类方法
这些方法都可以覆盖,原理相同,属性字典的搜索顺序
继承中的初始化
super()方法
super()可以访问到父类的属性
子类继承父类的时候,最好加上super().__init__()
作为一个好习惯,如果父类定义了__init__
方法,就应该在子类的__init__
中调用它
一个原则:自己的私有属性,就该自己的方法读取和修改,不要借助其他类的方法,即使时父类或者派生类的方法.
两个方法
isinstance(o,c) 判断o对象是不是c类或(c类的父类,祖父类,,,)的实例
issubclass(o,c) 判断o类是不是c类或者(c类的父类,祖父类,,,的子类