学习总结(二十七)
1.类的组成:
一个类由三个部分组成
1.类的名称 我是谁
2.类的父类们 我从哪里来
3.类的名称空间
2.元类:
1)什么是元类:
元类就是用来创建类的一个对象(方法),类的本身就是实例化后的元类,type方法就是python背后创建所有类的一个元类,
2)元类可以干什么:
元类可以通过限制类来满足某些条件或者需求,元类可以自动的改变类
3)怎么使用元类:
type(类名,父类元组,名称空间字典) #返回一个新的类
type(对象) #将会返回这个对象的类型
class 父类(type) 继承元类
class 子类(metaclass=父类) 指定要继承的父类
我们可以总结出 当你定义一个class时,解释器会自动调用type来完成类的实例化
3.元类常用方法
1) 在继承元类中的父类重写 __new__方法创建一个类对象,
2) 执行__init__方法会在父类中得到子类的类对象,类属性,类方法,子类继承其他类的对象
案例
class MytypeMetaClass(type): def __init__(self,a,b,c): super().__init__(a,b,c) print(a) # 继承类的名 print(b) #显示继承类,没有继承类就显示空元组 print(c) #变量和方法的以字典形式显示 class person(object,metaclass=MytypeMetaClass): name="谢忱" age=123456 def sube(self): print("suber") person()
3)__call__方法,该方法会在传参给类的时候调用
4) exec用于执行字符串形式的python代码 只要符合python都能执行 ,并且可以指定将执行产生的名字放入某个名称空间
4.单例设计模式
1)什么是单例设计模式
某个类如果只有一个实例对象,那么该类成为单例类
2)单列的好处
当某个类的所有对象特征和行为完全一样时,避免重复创建对象,浪费资源
案例一:
class SingletonMetaClass(type): #创建类时会执init 在这为每个类设置一个obj属性 默认为None def __init__(self,a,b,c): super().__init__(a,b,c) self.obj = None # 当类要创建对象时会执行 该方法 def __call__(self, *args, **kwargs): # 判断这个类 如果已经有实例了就直接返回 从而实现单例 if self.obj: return self.obj # 没有则创建新的实例并保存到类中 obj = type.__call__(self,*args,**kwargs) self.obj = obj return obj
案例二:
class HealthCheck: _instance=None def __new__(cls, *args, **kwargs): if not HealthCheck._instance: HealthCheck._instance=super(HealthCheck,cls).__new__(cls,*args,**kwargs) return HealthCheck._instance # 这可以作为一个列表 def __init__(self): self.servers=[]
5.异常
1)什么是异常
异常是程序运行过程中发生的非正常情况,是一个错误发生时的信号
处理异常的目的就是提高程序的健壮性
2)异常的分类
TypeError: 'int' object is not subscriptable 对象不能被切片 TypeError: 'list' object is not callable 对象不能被调用 IndexError: list index out of range 索引超出范围 TypeError: 'builtin_function_or_method' object is not iterable 对象不能被迭代 KeyError: 'xxx' 不存在这个key FileNotFoundError: [Errno 2] No such file or directory: 'xxxxx' 文件找不到
3)异常的组成:
Traceback (most recent call last): File "F:/python8期/课堂内容/day29/11.常见异常.py", line 22, in <module> with open("xxxxx") as f: FileNotFoundError: [Errno 2] No such file or directory: 'xxxxx' Traceback 是异常追踪信息 用于展示错误发生的具体位置 以及调用的过程 其中 包括了 错误发生的模块 文件路径 行号 函数名称 具体的代码 最后一行 前面是错误的类型 后面 错误的详细信息 在查找错误时 主要参考的就是详细信息
4)异常处理
语法:
try:
可能会出现异常的代码 放到try里面
except 具体异常类型 as e:
如果真的发生异常就执行except
5)如何正常处理异常
-
-
try 仅在 即使你知道为什么发生错误 ,但是你却无法避免 例如 你明确告诉用户 需要一个正确文件路径 然而用户依然传入了错误的路径
如 socket 双方都要使用管道 ,但是如果一方有由于某些原因强行关闭了 ,即使你知道原因也无法避免出错 那就只能try 保证程序正常结束
总结一句话:能不加try 就不加try
6)自定义异常
当系统提供异常类不能准确描述错误原因时 就可以自定义异常类继承自Exception即可
class MyException(Exception):
pass
7) 主动抛出异常
什么时候需要主动抛出异常
当我们做功能的提供者,给外界提供一个功能接口
主动抛 出异常使用raise 关键字后面可以跟任何Exception的子类 或是 对象
raise MyException
raise MyException("错误具体原因!")
6.
断言 其实可以理解为断定的意思
条件是否成立其实可以使用if来判断
其存在的目的就是 为了简化if 判断而生的