博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习日记0827异常处理 元类 自定义元类 自定义元类来实例化类 属性查找顺序...
阅读量:7090 次
发布时间:2019-06-28

本文共 2545 字,大约阅读时间需要 8 分钟。

异常处理

  什么是异常处理:

    异常是程序运行过程中发生错误的信号,一旦程序中出现异常,并且没有被处理,那么这个异常就会被抛出,并且程序会因此终止

    异常包含三个部分:

      1 traceback异常的追踪信息

      2 异常的类型

      3 异常的信息

    错误分为两大类:

      1 语法上的错误

      2 逻辑上的错误

  怎么处理异常:

    

try:    #要处理的可能含有异常的语句Except 异常类型 as 变量名(里面存放的是要抛出的异常的信息):    #抛出异常是处理的代码

  万能异常类型:

    Exception

  try.....Except.....else当没有异常时会执行的语句(需要放在Except的后面)....finally最后执行的语句(一般存放回收系统资源的语句)....

元类

  什么是元类:

    在python中一切皆对象,那么有一些没有被实例化过的对象是怎么来的呢,它们都是由元类type实例化得到的

  如:

class OldboyTeacher:    def __init__(self,name,age,sex):        self.name=name        self.age=age        self.sex=sex    def score(self):        print('%s is scoring' %self.name)tea1=OldboyTeacher('egon',18,'male')#对象tea1是OldboyTeacher实例化得来的,那么对象OldboyTeacher是元类type实例化得来的# print(type(tea1))print(type(OldboyTeacher))

  class的底层原理:

    1 得到类名

    2 得到类的基类

    3 拿到类的名称空间

    4 调用元类type实例化类

  

class_name = 'OldBoy'class_base = (object,)class_dic = {}class_body="""school = 'Oldboy'def __init__(self,name,age,sex):    self.name=name    self.age=age    self.sex=sexdef score(self):    print('%s is scoring' %self.name)"""exec(class_body,{},class_dic)OldBoy = type(class_name,class_base,class_dic)

 

自定义一个元类来控制类的产生:

    (关键点:__init__是在实例化对象是自动调用方法,而OldboyTeacher实质就是Mymate这个元类实例化产生的类(也可以说是对象),应为在OldboyTeacher()的()中会传入4个值依次是1类的类型

2 类名 3 父类 4 名称空间,所以在重新__init__方法时也要有4个值)

class Mymate(type):#凡是继承了type的类都叫元类    def __init__(self,class_name,class_base,class_dic):           if not class_name.lower():                raise typeError('类型必须是驼峰体')    doc=class_dic.get('__doc__')        if doc is None or len(doc) == 0 or len(doc.strip('\n ')) == 0:            raise TypeError('类体中必须有文档注释,且文档注释不能为空')class OldboyTeacher(object,metaclass=Mymeta): #OldboyTeacher=Mymeta('OldboyTeacher',(object,),{...})    school = 'Oldboy'    def __init__(self,name,age,sex):        self.name=name        self.age=age        self.sex=sex    def score(self):        print('%s is scoring' %self.name)print(OldboyTeacher.__dict__)

自定义一个元类来控制类的实例化:

  (关键点:__call__内置方法 是在对象产生完成之后再调用这个产生的对象而自动调用的方法)

class Mymate(type):    def __call__(self,*args,**kwargs):        obj = self.__new__(self)        obj.__init__(obj,*args,**kwargs)        return objclass OldboyTeacher(object,metaclass=Mymeta):     school = 'Oldboy'    def __init__(self,name,age,sex):        self.name=name        self.age=age        self.sex=sex    def score(self):        print('%s is scoring' %self.name)tea1=OldboyTeacher('egon',18,'male') # 会触发OldboyTeacher的类(即元类)中的    __call__函数tea1()

 

转载于:https://www.cnblogs.com/jianhaozhou/p/9544143.html

你可能感兴趣的文章
手把手教你构建 Kubernetes 1.8 + Flannel 网络(二)
查看>>
我的友情链接
查看>>
Nginx 负载均衡(简单配置)
查看>>
Linux之使用haproxy搭建web群集(2)
查看>>
在Linux启动时自动加载内核模块
查看>>
tomcat部署web程序,jkd环境变量设置,
查看>>
GitLab安装篇-Ubuntu 14.04 LTS
查看>>
我的友情链接
查看>>
沟通的艺术之幻灯片这奇女子
查看>>
一张图介绍CCIE
查看>>
mysql主从复制中出现的error和解救办法
查看>>
我是新手零基础,想学java什么方式比较迅速
查看>>
创建应用yum仓库
查看>>
客户端无法立即执行组策略
查看>>
Android Studio 第七十期 - Android下载图片安装apk 获取权限
查看>>
dhcp服务的搭建
查看>>
2. SQL Server数据库状态监控 - 错误日志
查看>>
Kalilinux安装w3af
查看>>
使用extmail转发邮件时候出现邮件格式问题
查看>>
我的友情链接
查看>>