今日内容:

  异常处理

  元类介绍

  元类(通过元类中的__init__方法,改变实例化获得的类)

  元类(通过元类中的__call__方法,改变实例化获得的类实例化出来的对象)

1、异常处理:

  什么是异常处理?

    异常:异常就是错误发出的信号,一旦程序出错就会产生一个异常,如果该异常应用程序不处理,那么异常就会被抛出来,程序也会随之终止。

    异常包含三部分:

      1、traceback异常的追踪信息

      2、异常的信息

      3、异常的类型

    异常分为两大类:

      语法异常:应该在程序执行前就被修改

      逻辑异常

  为何用异常处理?

    避免程序因异常而崩溃,所以应该在程序中处理异常,增强程序健壮性。

##############################################################################

如何用异常处理:

try:
代码1
代码2
...
except IndexError:
...
except: ...:
...
else:#在程序没有出错的情况下执行else下面的代码
...
finally:#不管程序有没有出错都执行finally下面的代码,一般finally下面的代码用来回收资源
...

##############################################################################

#############################################################################

raise:可以主动抛出异常,一般与自定义的类结合使用

class zjnu:
def __init__(self,name,age):
self.__name = name
self.__age = age def get_info(self):
print(self.__name,self.__age) def set_info(self,name,age):
if not isinstance(name,str):
raise Mymistake('名字必须是字符串')#主动抛出异常
if not isinstance(age,int):
raise Mymistake('年龄必须是整型')#主动抛出异常
self.__name = name
self.__age = age class Mymistake(BaseException):#自定义的一个异常
def __init__(self,msg):
self.msg = msg
def __str__(self):
return 'SB'
stu1 = zjnu('yxf',18)
stu1.get_info()
stu1.set_info('lay',19)
stu1.get_info()

################################################################################

#######################################################################

assert:断言,将程序分为两个部分,可以判断上半部分获取的数据,如果不符合就直接抛出异常

L1 = [1,2,3,5,4]
assert len(L1) == 5 #用来判断上半段代码执行完后一些数据是否符合条件,不符合条件就没有必要执行下半段代码了
print('good job')

#######################################################################

元类:

  什么是元类?

    源自python中的一句话,一切皆对象,而对象是通过类的实例化而获得的

#################################################################################

class zjnu:
def __init__(self,name,age):
self.name = name
self.age = age def get_info(self):
print(self.name,self.age) tea1 = zjnu('lay',19)
# tea1 是zjnu类的实例化获得的,那么我们就可以认为在定义zjnu时,
# zjnu这个类也是一个类,是通过 zjnu = ...(...)来实例化获得的。 class Zjnu:
def __init__(self,name,age):
self.name = name
self.age = age def get_info(self):
print(self.name,self.age) tea1 = Zjnu('lay',19)
print(type(tea1))
print(type(Zjnu))
# 通过type(zjnu)我们发现zjnu = 元类(...)这是一个内置的元类:type. # 调用关系:
# 调用元类实例化 ====》 自定义的类
# 调用自定义的类实例化 ====》 自定义的对象 # class关键字自定义类的底层原理:四步
# 第一步:拿到自定义类的类名Zjnu
# 第二步:找到自定义类的基类object
# 第三步:产生一个空的名称空间
# 第四步:调用元类type实例化获得Zjnu这个自定义的类 (Zjnu = type(Zjnu,(object,),{....})) # 自定义类的三个重要组成部分
# 1、自定义类的类名
# 2、自定义类的基类们
# 3、自定义类的名称空间

#################################################################################

不依赖于class来模拟实例化出一个类

#################################################################################

# 第一步:拿到自定义的类名
class_name = 'Zjnu'
# 第二步:找到自定义类的基类们
class_class = (object,)
# 第三步:创建类的名称空间
class_dic = {}
class_body = '''
def __init__(self,name,age):
self.name = name
self.age = age def get_info(self):
print(self.name,self.age)
'''
exec(class_body,{},class_dic)
# 第四步:调用type类实例化获得我们自定义的类
Zjnu = type(class_name,class_class,class_dic)
print(Zjnu.__dict__)
tea1 = Zjnu('yxf',18)
tea1.get_info() # 自定义元类模板
class Myclass(type):
def __init__(self,class_name,class_class,class_dic):
print(self)
print(class_name)
print(class_class)
print(class_dic) class Zjnu(metaclass=Myclass):#Zjnu = Myclass('Zjnu',(object,),{...})
school = 'zjnu'
def __init__(self,name,age):
self.name = name
self.age = age class Myclass(type):
def __init__(self,class_name,class_class,class_dic):
print(self)
if class_name.islower():
raise NameError('类名必须为驼峰体')
print(class_name)
print(class_class)
print(class_dic) class zjnu(metaclass=Myclass):#Zjnu = Myclass('Zjnu',(object,),{...})
school = 'zjnu'
def __init__(self,name,age):
self.name = name
self.age = age

###################################################################################

利用原类来控制类的调用:

####################################################################################

class Myclass(type):
def __call__(self, *args, **kwargs):
# 1、先产生一个空对象
obj_stu1 = self.__new__(self)
# # 2、执行__init__方法,完成对空对象的初始化
self.__init__(obj_stu1,*args,**kwargs)
# 3、返回对象
return obj_stu1 class Zjnu(metaclass=Myclass):#Zjnu = Myclass('Zjnu',(object,),{...})
school = 'zjnu'
def __init__(self,name,age):
self.name = name
self.age = age
stu1 = Zjnu('yxf',18)
print(stu1.__dict__) # 利用元类来控制调用并将实例化的对象改成隐藏了的属性
class Myclass(type):
def __call__(self, *args, **kwargs):
# 1、先产生一个空对象
obj_stu1 = self.__new__(self)
# # 2、执行__init__方法,完成对空对象的初始化
self.__init__(obj_stu1,*args,**kwargs)
obj_stu1.__dict__ = {'_%s__%s'%(self.__name__,k):v for k,v in obj_stu1.__dict__.items()}
# 3、返回对象
return obj_stu1 class Zjnu(metaclass=Myclass):#Zjnu = Myclass('Zjnu',(object,),{...})
school = 'zjnu'
def __init__(self,name,age):
self.name = name
self.age = age stu1 = Zjnu('yxf',18)
print(stu1.__dict__)

###################################################################################

关于__new__属性查找的顺序

################################################################################################################

class Myclass(type):
def __call__(self, *args, **kwargs):
# 1、先产生一个空对象
obj_stu1 = self.__new__(self) # 这个__new__依照属性查找mro的规则先从自己(Zjnu)开始依次查找,最终找到元类中的__new__方法
# # 2、执行__init__方法,完成对空对象的初始化
self.__init__(obj_stu1,*args,**kwargs)
obj_stu1.__dict__ = {'_%s__%s'%(self.__name__,k):v for k,v in obj_stu1.__dict__.items()}
# 3、返回对象
return obj_stu1
class Bar(object):
# xxx = '333'
def asd(self):
pass class Foo(Bar):
# xxx = '222'
def arr(self):
pass class Zjnu(Foo,metaclass=Myclass):#Zjnu = Myclass('Zjnu',(object,),{...})
# xxx='111'
school = 'zjnu'
def __init__(self,name,age):
self.name = name
self.age = age stu1 = Zjnu('yxf',18)
print(stu1.xxx)

day29的更多相关文章

  1. Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming

    Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...

  2. day29 主机管理-堡垒机2-原生ssh会话记录

    day29课堂代码:https://github.com/liyongsan/git_class/tree/master/day29 课堂笔记: 通过原生Ssh 记录会话1. 在我们自己的堡垒机交互脚 ...

  3. day29——socket套接字(少量不全)

    day29 socket套接字 socket是处于应用层与传输层之间的抽象层,他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后,交由操作系统. 为什么存在socket抽象层? 如果直接与操 ...

  4. day29 元类及异常处理

    元类及异常处理 元类 什么是元类 在python中,一切皆对象,对象是由类产生的,那么类是不是对象呢? 举例: class A: pass print(type(A)) # <class 'ty ...

  5. day29并发编程

    day29并发编程 1.进程锁 一.使用锁维护执行顺序 代码: from multiprocessing import Process,Lock import os import time def t ...

  6. DAY29、元类

    一.eval内置函数eval内置函数的使用场景: 1.执行字符串会得到相应的执行结果 2.一般用于类型转换,得到dict.list.tuple例: dic_str = ''{'a':1,'b':2}' ...

  7. day29 二十九、元类、单例

    一.eval.exec内置函数 1.eval函数 eval内置函数的使用场景: ①执行字符串会得到相应的执行结果 ②一般用于类型转换得到dict.list.tuple等 2.exec函数 exec应用 ...

  8. Python:Day29 信号量、条件变量

    信号量:semaphore 信号量是用来控制线程并发数的.(理解:虽然GIL任意时刻都只有一个线程被执行,但是所有线程都有资格去抢,semaphore就是用来控制抢的GIL的数量,只有获取了semap ...

  9. day29 网络编程

    网络通信原理: http://www.cnblogs.com/linhaifeng/articles/5937962.html 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络 ...

  10. day29单例模式的4种实现模式

    单例模式的四种实现模式单例模式实现方式一: import settings class MySQL:  __instance=None  def __init__(self, ip, port):   ...

随机推荐

  1. element-ui input组件源码分析整理笔记(六)

    input 输入框组件 源码: <template> <div :class="[ type === 'textarea' ? 'el-textarea' : 'el-in ...

  2. eclipse 中springboot2.0整合jsp 出现No Java compiler available for configuration options compilerClassName

    今天使用eclipse创建springboot整合jsp出现一个问题,在idea中并没有遇到这个问题.最后发现是需要在eclipse中添加一个eclipse依赖,依赖如下: <dependenc ...

  3. 图片圆角显示与手机版文章页面CSS布局

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 转 Fira Code | 为写程序而生的字体

    原文:Fira Code | 为写程序而生的字体 Fira Code | 为写程序而生的字体 己短不可藏 6月前 · 1199 人阅读 关注TA 程序员福利!!!今天为大家带来一个专为程序员写程序设计 ...

  5. KOTLIN-1(常用网址)

    ---恢复内容开始--- 1.官网:http://kotlinlang.org/ 2.官方文档:https://kotlinlang.org/docs/reference 3.kotlin源码:htt ...

  6. C#反射的一些经验[转载]

    写代码的时候经常需要分析已有类型的信息例如:分析现有类型自动生成类, 或者为现有的类自动增加一些功能总结了一点点经验以ClassA  a; 为例1. 通过typeof(ClassA) 或者 a.Get ...

  7. 活字格Web应用平台学习笔记5 - 编辑和删除记录

    了几天,今天上活字格网站一看,他们获奖了,好厉害 荣膺盘古奖!活字格引领企业信息化建设新潮流 好吧,我继续学习,希望早点拿到认证证书. 今天要学的是编辑删除记录.目标: 还是接续之前的工程.做好后是这 ...

  8. 如何将水晶报表(Crystal Report)导入葡萄城报表

    当从旧的报表平台迁移到葡萄城报表工具时,意味着有大量的报表设计工作要重复去做,如果有一款工具能够在这些工具之间进行自由转换,就能省去报表开发几乎一半的工作量. 葡萄城报表为兼容其他报表控件,提供了简单 ...

  9. Android Monkey的使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/71750907 本文出自[赵彦军的博客] 什么是 Monkey Monkey 是一个 ...

  10. windows10如何打开vhd文件

    本人电脑安装了Visual Studio 2017,但是由于项目需求需要Core SDK(2.0)的版本支持,也就是2017最新版.所以现在需要利用visual Studio 2017最新版本的安装包 ...