今日内容详细
异常
异常就是错误发生的信号,我们需要对该信号做处理,如果不处理,往后的代码就不能执行了
异常的分类:
1.逻辑错误:是允许出现的,但是呢,编程的时候尽量避免逻辑错误的发生
2.错误类型:IndexError,TypeError等
3.错误的原因:通过这部分我们可以很精准的找到错误的具体原因,这块对我们解决问题是最重要的
解决异常的完整语法:
try:
except 错误类型1 as e:
pass
except 错误类型2 as e:
pass
except 错误类型3 as e:
pass
.....
else:
前面都没有异常才会走这个分支
finally:
不管有没有问题都会走这个分支
有时候我们需要程序主动抛出异常信息,来阻止代码的执行
raise 语法
raise IndexError('索引错误')
class Person():
def __init__(self,name,age):
if age.isdigit :
raise TypeError('类型错误')
self.name=name
self.age=age
per=Person('ln','3l')
print(per.name)
print(per.age)
断言就用在代码中检查和验证假设条件的工具
assert 条件 in 条件必须成立的标识符(表达式)
使用断言后,条件成立了后续代码才会走,否则直接报错,后续代码也就不走了
Mixins机制
一个子类可以同时继承多个父类,这样的涉及常被人诟病,一来它有可能导致可恶的菱形问题,二来在人的世界观里继承应该是个'is-a'关系,比如轿车之所以可以继承交通工具嘞,是因为基于人的世界观里,轿车是一个交通工具,而在人的世界观里,一个物品不可能是多种不同的东西
ss Vehicle:
'''这里面应该有其他交通工具都具备的功能'''
class FlyMixin():
def fly(self):
'''
飞行功能相应的代码
'''
print("I am flying")
class Flyible():
def fly(self):
'''
飞行功能相应的代码
'''
print("I am flying")
class CivilAircraft(FlyMixin, Flyible, Vehicle):
pass
class Helicopter(FlyMixin, Flyible, Vehicle):
pass
class Car(Vehicle):
pass
import socketserver
元类介绍
什么是元类?
即产生类的类
class Person:
pass
print(type(Person))
'''type是所有类的类,也就是说它就是所有类的元类'''
产生类的两种方法
1. class 类名():
pass
2. 由于所有的类都是有元类创建的,所以,我们可以通过type这个类造出来一个新的类
C1=type('C1', (), {'school':'SH'})
obj=C1()
print(C1.__dict__)
print(obj.__dict__)
3. 为什么要学元类? 有什么用?
比如:让你定义一个类,但是,类的名字首字母必须大写.
class Student():
pass
class a():
pass
"""
思考:我们的定制化代码应该写在哪里?
对象是如何产生的? 调用类然后执行类里面的__init__方法了
类是如何产生的? 推导应该是,造出类的类里面的__init__方法,而这个类恰好是type元类
得出结论:如果想定制化类的代码,应该写在元类的__init__方法
"""
推导:使用已知推导未知
class MyTypeClass(type):
def __init__(self, cls_name, cls_bases, cls_dict):
print(cls_name)
print(cls_bases)
print(cls_dict)
if not cls_name.istitle():
raise Exception("类名必须大写!!!")
super().__init__(cls_name, cls_bases, cls_dict)
"""元类不能够直接被继承,需要指定metaclass=MyTypeClass"""
class C1(metaclass=MyTypeClass):
def __init__(self):
print('C1.__INIT__')
C1()
元类的进阶用法
元类的__call__方法
对象() 的时候会调用产生对象的类中得__call__方法
推导:类名()? 会执行产生类的类中得__call__方法,其实就是元类type中得__call__方法
class MyClass(type):
def __call__(self, *args, **kwargs):
print(args)
print(kwargs)
if args:
raise Exception("必须使用关键字传参")
print('MyClass.__call__')
super(MyClass, self).__call__(*args, **kwargs)
class C1(metaclass=MyClass):
def __init__(self,name, age):
self.name = name
self.age = age
print('C1.__init__')
"""观察C1类里的__init__方法和MyClass里的__call__方法的执行顺序?"""
"""得出结论:在执行类的__init__方法之前,其实已经执行了元类的__call__方法了,既然这样,我们就可以在实例化对象的时候,对类做一些定制化"""
C1(name='kevin', age=20)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)