今日内容
一、多态与多态性
1.1多态
多态:同一种事物有多种形态
主要不是用来让子类重用代码的,而是统一多个子类使用同种功能的方法
例:
class Animal:
def talk(self):
pass
class Dog(Animal):
def talk(self):
print("汪汪汪")
class Cut(Animal):
def talk(self):
print("喵喵喵")
class Pig(Animal):
def talk(self):
print("哼哼哼")
obj1 = Dog()
obj2 = Cut()
obj3 = Pig()
1.2鸭子类型
本质其实不是继承同一个父类的功能,而是为了统一标准
1、可以不采用继承方法,而是用协商的方式让对象的功能名统一化
2、使用abc模块,但凡继承这个父类的子类们内必须有与父类同名的功能
如果没有的话子类在实例化时会报错
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass
二、面向对象高级
2.1内置函数
1、isinstance:判断一个对象是否是一个类的实例
例:
class Foo:
pass
obj = Foo()
print(isinstance(obj,Foo))
2、issubclass:判断一个类是否是另一个类的子类
例:
print(issubclass(Foo,object))
2.2内置方法
__开头并且__结尾的属性会在满足某种条件下自动触发
例一、
class People:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self): #打印对象时,自动触发__str__内代码运行,
return f"{self.name}:{self.age}" #并把返回值交给print打印,返回值必须是字符串类型
obj = People("xxx",18)
print(obj)
例二、
class People:
def __init__(self,name,age):
self.name = name
self.age = age
self.f = open("a.txt",mode="wt",encoding="utf-8")
def __del__(self): #在删除对象时,会自动触发__del__内代码,包括程序结束时也会触发
self.f.close() #主要是用来完成资源回收的
obj = People("xxx",18)
三、反射
3.1反射
通过字符串来映射到真正的功能身上
class People():
country = "china"
def __init__(self,name,age):
self.name = name
self.age = age
obj = People("xxx",18)
print(hasattr(obj,"country")) #判断字符串内容是否能被obj调用,即obj.country能不能被调用
res = getattr(obj,"country") #拿obj内的属性,即obj.country的内容
print(res)
setattr(obj,"xxx",1111) #为obj添加一个属性,即 obj.xxx = 1111
print(obj.xxx)
delattr(obj,"name") #删除obj内的属性
print(obj.name)
四、异常处理
4.1异常处理
'''
1、什么是异常:
异常是错误发出的信号
程序一旦出错就会产生一个异常
如果该异常没有被处理,该异常就会被抛出。程序的运行也随机终止
错误分成两种:
1、语法错误
2、逻辑错误
2、为何要处理异常:
不应该让程序出现崩溃
3、如何处理异常:
1、语法错误:
程序运行前就必须改正确
2、逻辑错误:
针对可以控制的逻辑错误,应该直接在代码层面解决
正对不可控制的逻辑错误,应该采用try...exceot...的方式解决
4、try...execpet一种异常产生之后的补救措施
tyr:
被检测的代码块1
被检测的代码块2
被检测的代码块3
execpet 异常的类型1 as e:
处理异常的代码
execpet 异常的类型2 as e:
处理异常的代码
execpet 异常的类型3 as e:
处理异常的代码
except (异常的类型4,异常的类型5,异常的类型6)as e: #如果是异常4,5,6都运行这段代码
处理异常的代码
except Exception: #都不属于以上所有异常才运行
处理异常的代码
else:
没有发生异常时执行的代码
finally:
无论有没有异常都会执行该代码,通常用来惊醒回收资源的操作
'''
例1:匹配到了异常程序并不会崩溃
print("start...")
try:
print(111)
print(222)
l = [11,22,33]
l[100]
print(333)
except IndexError as e:
print(e)
print("end...")
例2:没有匹配到异常运行到逻辑错误时程序照样会崩溃
print("start...")
try:
print(111)
print(222)
l = [11,22,33]
l[100]
print(333)
except KeyboardInterrupt as e:
print(e)
print("end...")
4.2常见异常类型
1、IndexError:列表索引异常
2、KeyError:字典取值异常
3、AttributeError:对象调用不存在异常
4、ValueError:值出现异常
5、ZeroDivisionError:数学层面异常
6、TypeError:函数参数异常
7、NameEooro:名字没有定义异常
4.3主动抛出异常的三种方式
1、断言:主要用来测试代码
判断目标代码块达没达到想要的目的,
如果达到了就继续运行下方代码,如果没达到就报错
例:
l = [111,222]
assert len(l) == 3 #判断条件是否成立,成立就当不存在,不成立就报错
print("后续代码")
2、raise:主动抛出异常
为用户定制规则时用户不遵从可以主动抛出异常
raise IndexError("索引错误")
自己选择抛出的错误类型
3、自定义异常
例:
class Permission(BaseException):
pass
#自己填写异常内容
raise Permission("权限异常")