继承 inheritance 和 派生 (derived)
什么是继承和派生
继承是延续旧类的功能,派生是在旧类的基础上添加新功能
为什么要继承:
继承的目的是延续旧的类的功能
派生的目的是在旧类的基础上添加新的功能
继承/派生的作用:
1) 用继承派生机制,可以将一些共有功能加在基类中,实现代码的共享.
2) 在不改变超类的代码的基础上改变原有的功能
继承/派生相关的名词:
基类(base class) / 超类(super class) / 父类(father class)
派生类(derived class) / 子类(child class)
单继承的语法:
class 类名(超类名):
...
继承说明:
任何类都直接或间接的继承自 object 类
object类是一切类的超类(祖类)
__base__ 属性
__base__ 属性用来记录此类的基类
查看所有内建类的办法:
>>> help(__builtins__)
覆盖 override(也叫重写 overwrite)
什么是覆盖
覆盖是指在有继承关系的类中,子类中实现了与基类(超类)同名的方法,在子类实例调用该方法时,实际调用的是子类中的覆盖版本,这种现象叫覆盖。
子类对象显式调用基类方法的方式:
基类名.方法名(子类实例, 实际参数)
super 函数
super(type, obj) 返回绑定超类的实例(要求obj必须为type类型的实例)
super() 返回绑定超类的实例,等同于:super(__class__ 实例方法的第一个参数),必须在方法内调用
作用:
返回绑定超类的实例,用超类的方法来调用其自身方法
用于类的函数:
issubclass(cls, class_or_tuple) 判断一个类是否继承自其它的类,如果此类cls 是class或tuple中的一个派生子类,则返回True, 否则返回False
示例:
class A:
pass
class B(A):
pass
class C(B):
pass
issubclass(B, A) # True
多态 polymorphic
什么是多态:
字面意思:多种状态
多态是指在有继承/派生关系的类中,调用基类对象的方法,实际能调用子类的覆盖方法的现象,叫多态
封装 enclosure
封装是指隐藏类的实现细节,让使用者不关心这些细节
注:
Python并不能实现C++语言中完全意义上的封装,python的封装是模拟(假的)的封装
私有实例变量和方法:
python类中,以双下划线(__)开头,不以双下划线结尾的标识符为私有成员
以 __开头的实例变量或方法无法在子类或类外部直接调用
面向对象编程语言的特征:
继承
封装
多态
多继承 multiple inheritance
多继承是指一个子类继承自两个或两个以上的基类
语法:
class 类名(超类名1, 超类名2, ...):
...
多继承的问题(缺陷)
标识符(名字空间)冲突的问题
(要谨慎使用多继承)
示例:
class A:
"小张写了一个类A"
def __init__(self):
self.name = "A"
class B:
"小李写了一个类B"
def __init__(self):
self.name = "B"
# 小王感觉小张和小李写的两个类自己可以用,于是:
class AB(A, B):
def infos(self):
print(self.name) # 请问打印结果是什么?
PEP8编码规范
代码编排:
1.使用4空格缩进,不使用Tab,更不允许用Tab和空格混合缩进
2. 每行最大长度不超过79字节,超过的部分使用反斜框折行
3. 类和全局函数定义间隔两个空行,类内方法定义间隔一个空行,其它地方可以不加空行
文档编排:
1. import 部分,按内建(标准), 三方,自己编写的模块顺序依次排放,之间空一行
2. 不要在一句import 中导入多个模块,比如不推荐import os, sys
3. 尽可能用import xx 而不采用from xx import yy引用模块,因为可能出现名字冲突
空格的使用
1. 各种右括号前不加空格
2. 逗号,冒号,分号前不要加空格
3. 函数的左括号前不要加空格
4. 序列的左括号前不要加空格
5. 运算符左右各加一个空格,不要为了对齐加空格
6. 函数默认参数使用的赋值符左右不加空格
7.不要将多条语句写在同一行,尽管使用';'是允许的
8. if/for/while语句中,即使执行语句只有一句,也必须另起一行
原则:避免不必要的空格