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.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('哼哼哼')# 定义了抽象基类,给父类的功能添加装饰器后,就规定了子类定义名字相同的这些功能,如果子类没有,就会报错

二:反射

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

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属性

例:

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:为什么用内置方法?
为了定制化我们的类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'

当__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'
'结束啦'

3.3 其他内置方法

link

四. 元类

什么是原类?
例:

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)
# 如何得到类

2:为什么要有原类?
3:怎么用原类?

五:异常处理

1:什么是异常?
异常是错误发生的信号,程序一旦出错就会产生一个异常,如果该异常没有被处理,该异常就会抛出来,程序的运行也随即终止。
错误分为两种:
· 语法错误
· 逻辑错误
2:如何处理异常?
监测异常的具体语法:

try:
	被检测代码块
except 异常类型1:
	针对异常类型1的解决方法
except 异常类型2:
	针对异常类型2的解决方案
except Exception: # 如果不论什么异常解决方案都固定,则可以只保留这部分
	针对其他异常类型的解决方案
else: # 不能只有try和else,语法错误
	当被监测代码块没有出现异常执行的代码
finally:
	无论被监测代码有没有出现异常都会执行的操作,一般是回收系统资源的操作

例:

list1=[1,2,3,4,5]
index=input('请输入您想取元素的位置:').strip()
try:
	res=list1[int(index)]
	print(res)
except IndexError:
	print('抱歉,您输入想索引元素的位置超出了列表的长度')
except ValueError:
    print('抱歉,请输入数字!')

抛出异常的例子:

l=[11,22]
if len(l)==3:
	print(123)
else:
	raise Exception('抱歉列表中元素不足三个')

六 异常其他

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

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

2:抛出异常

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

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

class Permission(BaseException):
	def __str__(self):
		return '抱歉,您没有获得许可批准!'
raise Permission

你可能感兴趣的:(python)