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
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 判断而生的