一:多态与多态性
多态指的是一类事物有多种形态,用继承来表现出多态的概念,用父类来统一和规定多个子类的
下面这种硬性规定死了子类的talk,不可以做修改,修改会报错(不推荐)
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def talk(self): pass class Dog(Animal): def talk(self): print('汪汪汪') class Cat(Animal): def talk(self): print('喵喵喵') class Pig(Animal): def talk(self): print('哼哼哼')
二:鸭子类型
不管你是不是,长得像鸭子就判断为鸭子,此种类型在于个人自觉遵守规则
class Dog: def talk(self): print('汪汪汪') class Cat: def talk(self): print('喵喵喵') class Pig: def talk(self): print('哼哼哼')
三:内置方法
1.isinstance和issubclass
isinstance():isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()
issubclass():方法用于判断参数 class 是否是类型参数 classinfo 的子类
class Foo: pass obj=Foo() print(isinstance(obj,Foo)) #判断obj是否是Foo的一个实例 print(isinstance([0,1,2,3],list)) #判断[0,1,2,3]是否是list的实例 #type可以做判断类型这件事,但是isinstance更为专业 print(issubclass(Foo,object) #判断一个类是否是另外一个类的子类
2.
__开头__结尾的属性在满足某种条件下会自动的触发,为啦完成某些定制性的行为
__str__
class People: def __init__(self,name,age): self.name=name self.age=age def __str__(self): return '%s:%s' %(self.name,self.age) obj=People('egon',19) print(obj) #打印时运行了def __str__(self)
结果是:egon:19
__delete__()
用这个对象的目的在于,删除对象会触发这个方法的运行(下面例子中的print('+++>>>'),经常用于回收资源
)
class people: def __init__(self,name,age): self.name=name self.age=age def __del__(self): print('+++>>>') obj=people('egon',18) del obj print('=========end========')
结果是:
+++>>>
=========end========
四:反射
class people: country='china' def __init__(self,name,age): self.name=name self.age=age def tell_info(self): print(self.name,self.age) obj=people('egon',18) setattr(obj,'xxx',111) #obj.xxx=111 print(obj.xxx) #结果是:111 # delattr(obj,'name') # print(obj.name) #删除name
五:异常处理
1.异常:是错误的信号,程序一旦出错就会产生一个异常,如果该异常没有被处理,程序的运行也随即终止。
错误分为两类:语法错误(不可犯)和逻辑错误
2.如何处理异常
2.1语法错误坚决避免
2.2逻辑错误
针对不可以控制的逻辑错误采用try...except,是异常产生后补救措施
格式:
try: #逻辑错误哦 !!!!!!
被检测的代码块
except 异常的类型1 as e:
处理异常的代码
except 异常的类型2 as e:
处理异常的代码
except (异常的类型1,2,3) as e:
处理异常的代码
except Exception: #万能异常
处理异常的代码
else:
没有发生异常时要执行的代码
finally:
无论异常与否都会执行该代码(退出try时候运行),通常用来进行回收资源的
(1)try不能单独只和else进行使用
(2)try可以单独和finally一起使用
例子1: print('start') try: print(111) print(222) l=[11,22,33] l[100] print(3333) except IndexError或者Exception as e:
print(e)
print('end....')
结果是: start 111 222 list index out of range end....
3.异常的种类
3.1异常的种类
IndexError 超出了索引的范围 如:l=[11,22] l[100] KeyError 字典中没有此k值 AttributeError class Foo: pass obj=Foo() obj.x ValueError 值有问题,如int('asfv') pass func() SyntaxError 语法错误 TypeError 参数由问题 def func(x):
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
assert下部分数据处理要有个前提才可以运行
l=[11,222,33] if len(l)!=3: #和下面的assert二选一 raise Exception('必须达到3个值') assert len(l)==3 print('后续代码') #建议用assert 测试程序时候用,当断言成功时运行print('后续代码'),不成功抛出异常
3.3 raise 主动抛出异常
raise IndexError('索引错误')
3.4自定义异常
raise IndexError('索引错误')