继承
-
继承分为
- 单继承
- 多继承
-
继承的优点
- 增加了类的耦合性(耦合性不宜多,宜精)。
- 减少了重复代码。
- 使得代码更加规范化,合理化。
-
调用父类的方法
- 父类.func(对象,其他参数)
- super().func(参数)
-
继承父类的构造函数
-
super(Person,self).__init__(name,sex,age) # 方法一 super().__init__(name,sex,age) # 方法二
-
-
多继承
-
一个子类继承多个父类
-
多继承的执行顺序
经典类:沿用深度优先算法。(从左至右,依次查找,每次都选取节点的最左边,一直找到头,如果没有,返回上一个节点在查询其他路线)
新式类:沿用C3算法。()
mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] ) (其中Child继承自Base1, Base2)
-
-
super是严格按照对象从属于类的mro顺序执行下一个类
类的成员
-
类中属性或方法前加"__"可以生成为私有属性
-
class A: company_name = '太白' # 静态变量(静态字段) __iphone = '1353333xxxx' # 私有静态变量(私有静态字段) def __init__(self,name,age): #特殊方法 self.name = name #对象属性(普通字段) self.__age = age # 私有对象属性(私有普通字段) def func1(self): # 普通方法 pass def __func(self): #私有方法 print(666)
- 公有成员,在任何地方都能访问
- 私有成员,只有在类的内部才能方法
-
-
装饰器
- 使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
- 使用装饰器@staticmethod在类中定义函数
- property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
-
isinstance(a,b):判断a是否是b类(或者b类的派生类)实例化的对象
-
issubclass(a,b): 判断a类是否是b类(或者b的派生类)的派生类、
-
type()中为type的就是元类
反射
-
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
-
四个可以实现自省的函数:hasattr,getattr,setattr,delattr
-
#检测是否含有某属性 obj为对象 print(hasattr(obj,'name')) #获取属性 obj为对象 n=getattr(obj,'name') #设置属性 setattr(obj,'sb',True) setattr(obj,'show_name',lambda self:self.name+'sb') # 调用show_name方法 print(obj.show_name(obj)) #删除属性 delattr(obj,'age') delattr(obj,'show_name')
-
异常处理
常用异常:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
- 基本语法
try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print e
- 多分支
一个try对应多个except的情况
-
万能异常
s1 = ‘hello’
try:
int(s1)
except Exception as e:
print(e) -
多分支+万能异常
try:
choice = int(input(‘请输入:’))
dicchoiceexcept ValueError:
print(‘请输入数字…’)
except KeyError:
print(‘您输入的选项超出范围…’)
except Exception as e:
print(e) -
与循环中的else比较类似,try代码中,只要出现了异常,则不会执行else语句,如果不出现异常,则执行else语句。
-
finally
- 如果出现异常并且成功捕获了,finally会在try中最后执行。
- 如果出现异常但是没有成功捕获,finally会在异常发生之前执行
- 关闭文件的链接链接,数据等链接时,需要用到finally。
- 循环中,finally也会在return之前执行。
-
raise TypeError(‘类型错误’)
-
assert 1==2, ‘1 不等于 2’《断言》条件为False报字符传中的错误