一、多态与多态性
面向对象的三大特点:封装、继承、多态
1、什么是多态?
多态指的是同一种事物有多种形态
2、为何要有多态==》多态会带来什么样的特性,多态性
多态性指的是可以在不考虑对象具体类型的情况下,而直接使用对象
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod # 强制统一标准的功能
def say(self): # 统一所有子类的方法
print('怎么叫的..', end='')
# 方便使用者,只要考虑父类有什么,子类一定有,要用新的话就覆盖
# python推崇的是一种鸭子类型
class People(Animal):
def say(self):
print('aaaaaa') # 派生,子类覆盖
class Dog(Animal):
def say(self):
super().say()
print('www')
class Pig(Animal):
def say(self):
super().say()
print('hhh')
obj1 = People()
obj2 = Dog()
obj3 = Pig()
obj1.say()
obj2.say()
obj3.say()
定义统一的接口,接收传入的动物对象
def annimal_say(annimal):
annimal.say()
annimal_say(obj1)
annimal_say(obj2)
annimal_say(obj3)
python推崇的是鸭子类型
二、内置方法
__开头并且是__结尾的属性会在满足某种条件下自动触发
class People:
def __init__(self, name, age):
self.name = name
self.age = age
self.f = open('a.json', mode='rt', encoding='utf-8')
def __str__(self): # 打印对象的时候自动触发
return '<%s:%s>' % (self.name, self.age)
# 返回值必须是字符串
def __del__(self):
self.f.close()
# 关闭掉打开的文件,回收内存空间
obj = People('egon', 19)
print(obj)
三、反射
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)
print(hasattr(obj, 'country')) # 查看obj是否具有country这个属性
# True
res = getattr(obj, 'country')
# 类似于字典的取值,提取这个属性值,没有就报错
print(res)
# china
method = getattr(obj, 'tell_info')
# 可以提取函数,加括号直接调用
method()
# 调用tell_info这个函数
setattr(obj, '顾鑫鑫', '吃屎')
# 更新属性,给obj增加一条key于value
print(obj.__dict__)
# {'name': 'egon', 'age': 18, '顾鑫鑫': '吃屎'}
delattr(obj, '顾鑫鑫')
print(obj.__dict__)
# {'name': 'egon', 'age': 18}
四、异常处理
1、什么是异常?
异常是错误发生的信号
程序一旦出错,就会产生一个异常
如果该异常没有被处理,该异常就会抛出来,程序的运行也随即终止
错误分为两种:
1、语法错误
2、逻辑错误
2、为何要处理异常
3、如何处理
语法错误>程序运行前必须改正确
逻辑错误>尽可能的避免逻辑错误
针对可以控制的逻辑错误,应该直接在代码层面就解决了
针对不可以控制的逻辑错误,应该采用try...except...
能不用就尽量不要用
4、try...except...是一种异常产生之后的补救措施
try:
被监测的代码块
excep 异常的类型1 as e:
处理异常的代码(不会被抛出来)
excep 异常的类型2 as e:
处理异常的代码(不会被抛出来)
excep 异常的类型3 as e:
处理异常的代码(不会被抛出来)
except Exception:#万能异常
处理异常的代码
else:
没有发生异常时,要执行的代码。
finally:
无论有没有异常,都会执行这串代码,通常是用来执行回收资源的操作
#断言
l = [111,222]
if len(l) != 3:
raise Exception('必须达到三个值')
assert len(l) == 3
print('后续代码。。。')
===============输出结果==============
Exception: 必须达到三个值
#raise 主动抛出错误
raise IndexError("索引错误")
#自定义异常
class Permission(BaseException):
def __init__(self,msg):
self.msg = msg
raise Permission("权限错误")