4、面向对象高级
多态与多态性
内置方法
反射
异常处理
💣💣💣💣💣多态与多态性💣💣💣💣💣
多态--同一种事物有多种形态
class Dog:
def talk(self):
print("汪汪汪")
class Cat:
def talk(self):
print('喵喵!')
class Pig:
def talk(self):
print("哼哼哼!")
obj1 = Dog()
obj2 = Cat()
obj3 = Pig()
obj1.talk()>>>>>>汪汪汪"
强制定义def talk 若不是就报错
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass
💣💣💣💣💣内置方法💣💣💣💣💣
class Foo:
pass
obj = Foo()
print(isinstance(obj,Foo) ininstance 判断类型 判断实例
print(isinstance([1,2,3],list))
print(isinstance(Foo,object))------> True
__开头__并且结尾的属性会在满足某种条件下自动触发
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('liu',18)
print(obj) #<egon:19>
del
class People:
def__init__(self,name,age):
self.name = name
self.age =age
self.f = open('a.txt',node = 'rt',encoding = 'utf-8')
def __del__(self):
self.f.close() # 回收资源
obj = People('liu',18)
del 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(dir(obj)) #查看类、对象的功能
print(hasatter(obj,'country')) = obj.country 查看有木有country
method = getatter(obj,'tell_info')
method # 字符串方式调用 tell info
setattr(obj,'xxx',111)
print(obj.xxx) === 111
delatter(obj,'name')
print(obj.name) # 报错,已被删除
print(hasattr(obj,'name') # False 没有了 已被删除
💣💣💣💣💣异常处理💣💣💣💣💣
程序出错会导致异常,不处理会抛出终止程序的运行
#语法异常------应该在程序运行前改正,一名合格的程序员不应该犯的错误
#逻辑异常------尽量减少异常的发生,在代码层面解决,实在不可控,可以用try.....except
try...except 异常产生后的补救方法
print('start...')
try:
被监测的代码块1
被监测的代码块2
被监测的代码块3
被监测的代码块4
被监测的代码块5
except 异常的类型1 as e:
处理异常的代码
except 异常的类型2 as e:
异常的代码
except (异常的类型4,异常的类型5,异常的类型6) as e:
处理异常的代码
except Exception: # 兜底专用,接受所有异常报警
处理异常的代码
else:
没有发生异常时要执行的代码
finally:
无论异常与否,都会执行该代码,通常用来进行回收资源的操作
print('end...')
尽量少用try except 可比避免的用 if 逻辑判断
#案例
age = input(">>>: ").strip()
if age.isdigit(): # 2、所以在这里加上个逻辑判断,
age = int(age) # 1、这里只有输入数字才能转int类型,若是用户输入非数字就会报错
if age > 19:
print('too big')
elif age < 19:
print('too small')
else:
print('you got it')
else:
print('必须输入数字')
用except接手异常,若是种类一样程序会被接收不会报异常,然后会继续运行try外层代码块
若不一样,程序仍然会报错 停止运行
#案例一、
print('start...')
try:
print(111)
print(222)
l=[11,22,33]
l[100] # 超出索引
print(3333) # 不会运行
except IndexError as e: 被indexError接收
print(e)
print('end...') #正常运行
#案例二、
print('start...')
try:
print(111)
print(222)
l=[11,22,33]
l[100] # 索引错误异常 程序终止
print(3333) #不会运行
except KeyError as e: keyError 无法接收 会仍然报异常
print(e)
print('end...') # 外层代码也不能运行
断言 写完一阶段代码 可用来检测程序有没有达到自己想要的结果
#案例一、
l = [111,222]
if len(l) != 3:
raise Exception('必须达到三个值‘) # 报异常
或可用
assert len(l) == 3 # 若程序符合 则assert不起作用,否则异常,测试完程序应该删除assert
#使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
#在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG 来禁用 assert 调用,示例代码如下:
include
define NDEBUG
include
自定义异常
class Permission(BaseException):
def __init__(self,msg):
self.msg = msg
raise Permission('权限错误')