python32days

发布时间 2023-10-11 15:57:39作者: 拆尼斯、帕丁顿

异常
元类

—————————————————————————————————————————————

异常就是错误发生的信号,我们需要对该信号做处理,如果不处理,往后的代码就不能执行了

异常的分类
逻辑错误 # 是允许出现的,但是呢,编程的时候尽量避免逻辑错误的发生
语法错误 # 不允许出现的

异常的组成:
1. Traceback:追溯信息,可以定位到错误发生的位置
2. 错误类型: XXXError(TypeError、KeyError、IndexError等)
3. 错误的原因:通过这部分我们可以很精准的找到错误的具体原因,这块对我们解决问题是最重要的

 

主动抛出异常:我们自己有时候也需要抛出一些异常信息,来阻止代码的执行
举例:
抽象类:在父类中限制子类必须有某个方法

 

 

 

 Python Mixins机制

 

—————————————————————————————————————————————元类简介

 

什么是元类?
即产生类的类

 产生类的两种方式

 

思考:我们的定制化代码应该写在哪里?

对象是如何产生的? 调用类然后执行类里面的__init__方法了
类是如何产生的? 推导应该是,造出类的类里面的__init__方法,而这个类恰好是type元类
得出结论:如果想定制化类的代码,应该写在元类的__init__方法

推导:使用已知推导未知
# 你能够直接修改元类的代码吗? 不能够直接修改元类的源码,我们是不是可以写一个子类,来继承type类,然后在子类里面的__init__方法中书写定制化代码,所以,还需要在子类里面执行父类的__init__方法

 元类的进阶用法

元类的__call__方法

对象() 的时候会调用产生对象的类中得__call__方法

 

观察C1类里的__init__方法和MyClass里的__call__方法的执行顺序?
得出结论:在执行类的__init__方法之前,其实已经执行了元类的__call__方法了,既然这样,我们就可以在实例化对象的时候,对类做一些定制化
 C1('kevin', 20) # 现在是位置传参,我限制让你限制不允许位置传参,只能够通过关键字传参/
C1(name='kevin', age=20) # 现在是位置传参,我限制让你限制不允许位置传参,只能够通过关键字传参/