一:多态与多态性
多态:指的是同一种事物有多种形态。
多态性:指的是不考虑对象属于哪种类型的情况下使用对象。
例:
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