python 异常处理高级形式例子_python面向对象编成高级,异常处理

一:多态与多态性

多态:指的是同一种事物有多种形态。

多态性:指的是不考虑对象属于哪种类型的情况下使用对象。

例:

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("哼哼哼!")

obj1 = Dog()

obj2 = Cat()

obj3 = Pig()

obj1.talk()

obj2.talk()

obj3.talk()

def talk(animal): animal.talk()

talk(obj1)

talk(obj2)

talk(obj3) class Dog: def talk(self): print("汪汪汪")

class Cat: def talk(self): print('喵喵!')

class Pig: def talk(self): print("哼哼哼!")1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

1.1 鸭子类型

只要看着像鸭子,长的像鸭子,那就是鸭子类型。

例:

# 代码示范:强制子类使用父类的方法

import abc

class Animal(metaclass=abc.ABCMeta): # 定义抽象基类,Animal已不可单独调用

@abd.abstractmethod # 强制约束所有子类都得有这些功能

def say(self):

print('动物是这样叫的',end='')

class Dog(Animal):

def say(self):

super().say()

print('汪汪汪')

class Cat(Animal):

def say(self):

super().say()

print('喵喵喵')

class Pig(Animal):

def say(self):

super().say()

print('哼哼哼')# 定义了抽象基类,给父类的功能添加装饰器后,就规定了子类定义名字相同的这些功能,如果子类没有,就会报错1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

二:反射

反射机制被视为动态语句的核心。在程序运行过程中,动态获取数据的信息。当程序获取对象的时候,程序能够动态获取到对象的属性,方法等等。

2.1 反射机制的实现原理

先通过print(dir(对象))拿到这个对象所有的内置功能,发现都是字符串格式。再想办法取到字符串属性对应的功能对象.dict[字符串属性]。

2.2 四个内置函数的使用

hasattr

getattr

setattr

delattr

四个内置方法将在下面统一演示:

class RealEstate:

address='北京'

def __init__(self,name):

self.name=name

def tell_info(self):

print(self.name) obj1=RealEstate('龙湖地产')

# haveattr(对象/类,属性的字符串格式)----->bool

print(haveattr(obj1,'age'))-----># False

print(haveattr(RealEstate,'address'))-----># True

# getattr(对象/类,属性的字符串格式,default:None)----->找到的话返回属性的值,找不到的话返回default的值

print(getattr(obj1,'name'))-----># '龙湖地产'

print(getattr(obj1,'address','抱歉,该属性不存在'))-----># '抱歉,该属性不存在'

res=getattr(RealEstate,''tell_info)

res(obj1)-----># '龙湖地产'

# setattr(对象/类,属性,属性的新值)----->属性存在的话则重新赋值,不存在的话则创建属性

setattr(obj1,'money','一个亿')

print(obj1.money)

setter(obj1,'name','啊哈地产')

print(obj1.name)-----># '啊哈地产'

# delattr(对象/类,属性)----->属性存在则删除属性,属性不存在报错

delattr(obj1,'namenamename')-----># 报错

delattr(obj1,'address')-----># 删除address属性1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

例:

class FtpServer:

def put(self):

print('正在执行上传功能')

def get(self):

print('正在执行从下载功能')

def interactive(self):

module=input('>>>:').strip()

if hasattr(self,method): getattr(self,method)()

else: print('输入的指令不存在')

obj=FtpServer()

obj,interactive()1

2

3

4

5

6

7

8

9

10

11

12

13

三. 内置方法

1:什么是内置方法?

定义在类内部,以__开头并以__结尾的方法

特点:会在某种情况下自动触发执行

2:为什么用内置方法?

为了定制化我们的类or对象

3:怎么用内置方法?

3.1 str,repr,format

str__方法会在打印的时候自动触发,只能返回一个字符串。同样效果的还有__repr(self),format(self,format_spec)

例:

class People:

def __init__(self,name,age):

self.name=name

self.age=age

def __str__(self):

return '{}:{}'.format(self.name,self.age)

obj1=People('wth',20)

print(obj1)-----># 'wth:20'1

2

3

4

5

6

7

8

当__str__,repr__同时存在的时候,会按照__str__规定的格式进行打印。

3.2 del

析构方法,当对象在内存中被释放时(清理内存时被清理掉),自动触发执行。如果产生的对象仅仅只是python程序级别的,那么无需定义__del,如果产生对象的同时还会向操作系统发起资源调用,即一个对象有用户级与内核级两种资源,比如(这个对象的一个属性链接到了文件对象或者数据库),则必须在清楚对象的同时回收操作系统资源,这就用到了__del__。如果我们在文件的进程中没有释放内存中的对象的名称空间,程序文件运行完后其占用的资源也会被内存回收。

class Teacher:

def __init__(self,name,age):

self.name=name

self.age=age

self.f=open('a.txt','wb') def __str__(self):

return '{}---{}'.format(self.name,self,age) def __del__(self):

self.f.close()

print('over')

# 情况一:

obj1=Teacher('wth',20)

print('结束啦')

# 如果在所有代码运行结束后没有删除对象,__del__会自动执行

# 程序运行结果:

'结束啦'

'over'

# 情况二:

obj1=Teacher('wth',20)

del obj1

print('结束啦')

# 如果先调用删除对象,则在程序结束后,不需要回收对象占用的内存空间

# 程序运行结果:

'over'

'结束啦'1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

3.3 其他内置方法

四. 元类

什么是原类?

例:

class People:

def __init__(self,name,age)

self.name=name

self.age=age

def say(self):

print('{}-{}'.format(self.name,self.age))

# 如何得到对象:

obj=调用类()

obj=People('wth',20)

# 如何得到类1

2

3

4

5

6

7

8

9

10

2:为什么要有原类?

3:怎么用原类?

五:异常处理

1:什么是异常?

异常是错误发生的信号,程序一旦出错就会产生一个异常,如果该异常没有被处理,该异常就会抛出来,程序的运行也随即终止。

错误分为两种:

· 语法错误

· 逻辑错误

2:如何处理异常?

监测异常的具体语法:

try:

被检测代码块

except 异常类型1:

针对异常类型1的解决方法

except 异常类型2:

针对异常类型2的解决方案

except Exception: # 如果不论什么异常解决方案都固定,则可以只保留这部分

针对其他异常类型的解决方案

else: # 不能只有try和else,语法错误

当被监测代码块没有出现异常执行的代码

finally:

无论被监测代码有没有出现异常都会执行的操作,一般是回收系统资源的操作1

2

3

4

5

6

7

8

9

10

11

12

例:

list1=[1,2,3,4,5]

index=input('请输入您想取元素的位置:').strip()

try:

res=list1[int(index)]

print(res)

except IndexError:

print('抱歉,您输入想索引元素的位置超出了列表的长度')

except ValueError: print('抱歉,请输入数字!')1

2

3

4

5

6

7

8

9

抛出异常的例子:

l=[11,22]

if len(l)==3:

print(123)

else:

raise Exception('抱歉列表中元素不足三个')1

2

3

4

5

六 异常其他

1:断言 (测试程序的时候使用)

l=[11,22]

assert len(l)==3 # 如果声明的内容成立,assert语句当作不存在。但如果assert的内容不满足,会抛出AssertionError1

2

2:抛出异常

raise 异常的的类型或者自定义异常的类型1

3:自定义异常(通过BaseException)

class Permission(BaseException):

def __str__(self):

return '抱歉,您没有获得许可批准!'

raise Permission1

2

3

4

文章来源: blog.csdn.net,作者:粉耗子,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_53832067/article/details/112689399

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值