首页 > 其他分享 >抛出异常 和 元类

抛出异常 和 元类

时间:2023-10-12 20:11:07浏览次数:32  
标签:__ 抛出 self 元类 init C1 异常 class

1. 主动抛出异常

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

主动抛出异常:我们自己有时候也需要抛出一些异常信息,来阻止代码的执行
举例:
    抽象类:在父类中限制子类必须有某个方法
import abc
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 这么设置之后,以后所有继承Animal类的子类中都必须有speak函数
    def speak(self):pass
    
class People(Animal):
    def speak(self):
        pass
       
    """不推荐使用这种方式"""

# 推荐使用这种
class Animal():
    def speak(self):
        raise Exception("请先实现speak功能")  # 这个方式是最常用,因为简单


class People(Animal):
    pass

obj=People()
obj.speak()


# 断言
# assert 条件  # 条件必须是成立的
# l = ['kevin', 'jason', 'tank1']
# assert 'tank' in l
# print(123)


自定义异常
class MyException(BaseException):
    def __init__(self, msg):
        self.msg = msg
    def __str__(self):
        return self.msg

    def reponse(self):
        pass


raise MyException('用户名必须填写')

2. 元类

产生类的两种方法

1. class 类名():
        pass
    
2. 由于所有的类都是有元类创建的,所以,我们可以通过type这个类造出来一个新的类
    # type(object_or_name, bases, dict)
    # 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__方法
        
    """
    推导:使用已知推导未知
    # 你能够直接修改元类的代码吗? 不能够直接修改元类的源码,我们是不是可以写一个子类,来继承type类,然后在子类里面的__init__方法中书写定制化代码,所以,还需要在子类里面执行父类的__init__方法

class MyTypeClass(type):
    def __init__(self, cls_name, cls_bases, cls_dict):
        print(cls_name)  # 类名C1
        print(cls_bases)  # ()父类
        print(cls_dict)  # {'__module__': '__main__', '__qualname__': 'C1'}
        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) # ()  ('kevin', 20)
        print(kwargs) # {'name': 'kevin', 'age': 20} {}
        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('kevin', 20) # 现在是位置传参,我限制让你限制不允许位置传参,只能够通过关键字传参/
C1(name='kevin', age=20) # 现在是位置传参,我限制让你限制不允许位置传参,只能够通过关键字传参/

 

标签:__,抛出,self,元类,init,C1,异常,class
From: https://www.cnblogs.com/lchengshao/p/17758231.html

相关文章

  • 异常,断言,Mixins机制,元类
    异常,断言,Mixins机制,元类异常异常就是错误发生的信号,我们需要对该信号做处理,如果不处理,往后的代码就不能执行了异常的分类 逻辑错误#是允许出现的,但是呢,编程的时候尽量避免逻辑错误的发生语法错误#不允许出现的异常的组成: 1.Traceback:追溯信息,可以定位到错......
  • 智慧安防视频监控系统EasyCVR平台突然运行异常,是什么原因?
    随着互联网技术的发展与视频技术的进步,视频监控系统EasyCVR安防视频综合管理平台支持多类型设备、多协议方式接入,包括市场主流标准协议国标GB28181、RTMP、RTSP/Onvif协议等,以及厂家私有协议,如海康SDK、大华SDK、海康Ehome等。平台可兼容市面上绝大多数品牌的视频源设备,对外可分发......
  • 日期格式转换异常:Java 8 date/time type `java.time.LocalDateTime` not supported by
    异常信息:"unexpectederror:Typedefinitionerror:[simpletype,classjava.time.LocalDateTime];nestedexceptioniscom.fasterxml.jackson.databind.exc.InvalidDefinitionException:Java8date/timetype`java.time.LocalDateTime`notsupportedbydefault:......
  • java RestTemplate集成HttpClient池化及异常重试
    解决存在网络隔离,首次连接请求被拒绝情况SocketException首次请求超时情况SocketTimeoutException无返回数据清空NoHttpResponseException进行重试importorg.apache.http.HttpEntityEnclosingRequest;importorg.apache.http.NoHttpResponseException;importorg.apache.htt......
  • Linux 磁盘空间异常爆满的排查和处理
    一、问题现象在服务验证中,遇到磁盘空间使用率接近100%,业务操作出现异常具体:测试升级过程中,磁盘分区的容量空间使用殆尽,导致升级失败,手动操作删除一些文件后,磁盘空间仍旧没有释放,具体查看的时候确实没有多大大文件 二、问题排查思路:1.通过  df-Hl命令查看  2.查看......
  • Python元类详解
    Python中万物皆对象Python是一门面向对象的语言,所以Python中数字、字符串、列表、集合、字典、函数、类等都是对象。利用type()来查看Python中的各对象类型In[11]:#数字In[12]:type(10)Out[12]:intIn[13]:type(3.1415926)Out[13]:floatIn[14]:#字符串......
  • 组合 反射 抛出异常
    1.组合组合:把另外一个类的对象属性赋值给当前对象的属性首先要明白什么是什么的区别为什么要继承父类比如三个类老师类学生类课程类;虽然老师和学生有课程但是老师和学生是课程吗?还是老师和同学是课程"""isa的关系代表的是继承的关系和什么有什......
  • Kotlin协程的异常处理
    捕获异常Kotlin协程中执行的代码如果可能发生异常,最简单直接的办法也是可以通过try-catch语句来捕获异常GlobalScope.launch{try{println(1/0)}catch(e:Exception){//cancatchexception}}但try-catch只能捕获该协程代码块中......
  • 异常捕获 计算耗时
    fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.keysimportKeysfromtimeimportsleep,ctimefromdatetimeimportdatetime#获得当前的时间datetime.now()可以计算出耗时defwait(loc):try:......
  • 关于Winform中使用DataGridView显示数据时,CheckBox选中状态异常问题
    使用C#创建的Winfrom项目,使用DataGridView显示数据,第一列中使用了DataGridViewCheckBoxColumn实现复选功能。但是当我绑定好数据后测试时,发现勾选和取消勾选的操作表现完全不按照预想的来——连续勾选几行后取消其中部分行的选中状态,再重复选中和取消时,原本不该被选中的checkBox......