今日内容:

  异常处理

  元类介绍

  元类(通过元类中的__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. 对象属性键值[key]属性问题

    1,obj[key]此时key代表是循环中的一个变量. var obj = {key:3,key1:1,key2:2,key3:3,toSting:4}; for (key in obj) { con ...

  2. PDO中的预处理

    PDO中的基本的原理和步骤和MySQL中的预处理都是一样的,只不过就是把MySQL中的预处理所有命令行的语法封装成了PDO对象的几个公开的方法而已! 1.发送预处理语句 此时,我们需要调用pdo对象的 ...

  3. 设计模式原则(6)--Open-Closed Principle(OCP)--开闭原则

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.定义: 一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进行扩展. 2.使用场 ...

  4. Django中Ajax提交数据的CSRF问题

    错误信息: Forbidden (CSRF token missing or incorrect.): 什么是CSRF: django为用户实现防止跨站请求伪造的功能,通过中间件 django.mid ...

  5. css3之transform属性实现div不定宽高垂直水平居中

    transform的作用 transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜.(w3cschool) transform的兼容性 transfor ...

  6. hihocoder [Offer收割]编程练习赛12 [1495] ---- 矩形分割

    原题链接 矩形分割 算法分析: 解决该题要用到"并查集"的思想. 这里有一篇不错的博客介绍并查集: 并查集(Union-Find)算法介绍 记 int total=N*M,这里会有 ...

  7. Cookie、Session 和 Token区别

    1 Cookie.Session 和 Token 都是用来做持久化处理的,目的就是让客户端和服务端相互认识.Http 请求默认是不持久的没有状态的,谁也不认识谁.   2 Cookie: 是存放在客户 ...

  8. [iOS] UICollectionView实现图片水平滚动

    最新更新: 简单封装了一下代码,参考新文章:UICollectionView实现图片水平滚动 先简单看一下效果: 新博客:http://wossoneri.github.io 准备数据 首先先加入一些 ...

  9. Python 3前言

    Python具有简单.易学.免费.开源.可移植.可扩展.可嵌入.面向对象等优点,它的面向对象甚至比java和C#.net更彻底. 作为一种通用语言,Python几乎可以用在任何领域和场合,角色几乎是无 ...

  10. Net Core通用主机项目报错 程序不包含适合于入口点的静态Main

    Net Core通用主机的介绍: https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=as ...