一. 异常
1. 异常的简介
在Python中,异常是指在程序执行过程中发生了错误或异常情况而导致程序无法正常运行。面向对象中的异常主要是指异常类,它们用于表示不同类型的异常情况,并提供了相应的处理方式。,我们可以使用try,except语句来处理。
异常的组成:1.Traceback:追溯信息,可以定位异常所发生的位置。
2.错误的数据类型:KeyError, TypeError, IndexError等
,也可以使用万能的类型:Exception
3. 错误的原因:通过原因我们可以快速的精准找到异常的原因从而解决问题。
2. 解决异常的语法
解决异常的完整语法: try: 被监测的代码(这块儿一般写可能会发生异常的代码) except 错误类型1 as e: print(e) # 查看到错误的原因 except 错误类型2 as e: print(e) # 查看到错误的原因 except 错误类型3 as e: print(e) # 查看到错误的原因 except 错误类型4 as e: print(e) # 查看到错误的原因 except Exception as e: '''万能的异常,以上所有的类型都没有被找到,就交给Exception处理''' print(e) # 查看到错误的原因 else: print('被监测的代码没有异常的时候会走这个分支') finally: print('不管被监测的代码有么有异常都会走')
3. 主动抛出异常
在某些特殊情况下,我们也需要主动的去抛出一些异常,来阻止代码的运行。
例:
import abc """使用抽象化来限制一些操作""" class Student(metaclass=abc.ABCMeta): # 使Student类抽象化 school = 'SH' @abc.abstractmethod def speak(self): print('可以说话') class People(Student): # People是人类所以可以speak,里面也必须有speak,否则报错! def speak(self): print('可以说话') """但是我们一般不推荐这样去写""" """主动报错,直接限制代码的运行,如果不这么做就直接不让代码运行下去""" class Animal(): def speak(self): raise Exception('先实现speak功能') # 这是最常用的方式,所以推荐, # 语法结构关键字raise # 报错类型xxxError('输入的内容') class Master(Animal): pass obj = Animal() obj.speak() """输出结果为Traceback (most recent call last): File "D:\pythonProject\pythonProject2\day32.py", line 38, in <module> obj.speak() File "D:\pythonProject\pythonProject2\day32.py", line 28, in speak raise Exception('先实现speak功能') # 这是最常用的方式,所以推荐, Exception: 先实现speak功能 """
补充:断言:
"""断言: 关键字:assert 条件(条件是必须成立的)""" l1 = ['kiki', 'coco', 'nana'] assert 'kiki' in l1 # 判断'kiki'是否在列表里 """后续的'kiki'必须要用这个元素"""
自定义异常:
class MyException():
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def sls(self):
print('不输入用户名')
raise Exception('必须输入用户名')
二。Python Mixins机制
"""以一些交通工具做例子:"""
class Vehicle(): # 主类:包含多个主要功能。
def fly(self):
print('会飞')
def run(self):
print('会跑')
class Flyable():
def fly(self): # 辅类里一般用的功能很少
pass # 和飞行相关的代码
print('会飞')
"""继承类的书写顺序:先写主类,然后写辅类
辅类在左边,主类在右边,可以有多个辅类,但是主类只能有一个
命名方式以Mixin,able,ible为后缀"""
class FlyMixin():
def fly1(self):
print('关于飞行的其他代码')
class F1(Flyable, FlyMixin , Vehicle):
pass
print('这是载具1')
class F2(Flyable,FlyMixin,Vehicle):
print('载具2')
class Car(Vehicle):
print('汽车不会飞,但是按照继承的话会飞了')
pass
三, 元类(type)
元类的简介:
元类就是创造类的类就是type创造出来的,在 Python 中,元类是创建类的类。简单地说,元类可以用来控制类的创建行为和属性。Python中所有的事物都是对象,包括类,而元类就是用来创建这些类的对象。元类提供了一个方法来控制类的创建和初始化,可以添加,修改或删除类的属性,甚至可以改变类的继承关系。通常情况下,我们不需要使用元类,但在某些特殊的情况下,使用元类可以更加灵活和强大。
我们可以通过点击源码查看 :
我们可以看到ttype创建了(object)
类是由什么产生的:
int # class int(object): str # class str(object): list # class list(object): res=int(123) # 123 str('hello') list([1,2,3,4]) print(type(123)) # <class 'int'>
元类type:
class Student(): pass """student就是type产生的类""" print(type(Student)) # <class 'type'> class A(): pass print(type(A)) # <class 'type'> """type是所有的类,也就是所有类的元类"""
1. 产生类的两种方式
1. 使用class 类名的方法
class A(): pass
2. 由于所有的类都是由type所产生的,那么我们可以通过type来创造一个新的类
"""class 类名""" class A(): pass class Student(A): pass """由于所有的类都是由type所产生的,那么我们可以通过type来创造一个新的类""" # type(object_or_name, bases, dict) c1 = type('类名', (), {'school': 'ss'}) obj = c1 print(c1.__dict__) print(obj.__dict__) # 打印出的结果相同
3. 为什么要学元类,有什么作用
示例:
class MyType(type): def __init__(self, class_name, class_bases, class_dict): print(class_name) # 类名 print(class_bases) # 基类名 print(class_dict) # 空间地址 """判断用户名是否为大写,如果为大写则输出""" if not class_name.istitle(): raise Exception('必须大写') super().__init__(class_name, class_bases, class_dict) """元类不可以直接被继承,需要metaclass = MyType""" """当类名小写时:Traceback (most recent call last): File "D:\pythonProject\pythonProject2\day32.py", line 212, in <module> class ot(metaclass=MyType): File "D:\pythonProject\pythonProject2\day32.py", line 207, in __init__ raise Exception('必须大写') Exception: 必须大写 """ class Bot(metaclass=MyType): def __init__(self): print('Bot.__INIT__') Bot()
当输入的类正确符合条件时:
当输入的类为小写时,则会输出我们抛出的异常
2. 元类的进阶用法
限制不允许使用位置参数传参,只能用关键字传来传参
示例:
"""定义一个类,不能使用位置参数传参"""
class MyType(type):
def __call__(self, *args, **kwargs):
# print(args) # ('kiki', 19)
# print(kwargs) # {'name‘:’kiki','age':19}
if args:
raise Exception('只能使用关键字传参数')
print('请使用关键字')
super(MyType, self).__call__(*args, **kwargs)
class Args(metaclass=MyType):
def __init__(self, name, age):
self.name = name
self.age = age
print('我传关键字')
"""打印结果为:请使用关键字
我传关键字
"""
Args(name='kiki', age=10)
"""当输入的参数为位置参数时,{}
Traceback (most recent call last):
File "D:\pythonProject\pythonProject2\day32.py", line 251, in <module>
class Args(metaclass=MyType):
File "D:\pythonProject\pythonProject2\day32.py", line 246, in __init__
raise Exception('只能使用关键字传参数')
Exception: 只能使用关键字传参数"""