今日内容:
异常处理
元类介绍
元类(通过元类中的__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的更多相关文章
-
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...
-
day29 主机管理-堡垒机2-原生ssh会话记录
day29课堂代码:https://github.com/liyongsan/git_class/tree/master/day29 课堂笔记: 通过原生Ssh 记录会话1. 在我们自己的堡垒机交互脚 ...
-
day29——socket套接字(少量不全)
day29 socket套接字 socket是处于应用层与传输层之间的抽象层,他是一组操作起来非常简单的接口(接受数据)此接口接受数据之后,交由操作系统. 为什么存在socket抽象层? 如果直接与操 ...
-
day29 元类及异常处理
元类及异常处理 元类 什么是元类 在python中,一切皆对象,对象是由类产生的,那么类是不是对象呢? 举例: class A: pass print(type(A)) # <class 'ty ...
-
day29并发编程
day29并发编程 1.进程锁 一.使用锁维护执行顺序 代码: from multiprocessing import Process,Lock import os import time def t ...
-
DAY29、元类
一.eval内置函数eval内置函数的使用场景: 1.执行字符串会得到相应的执行结果 2.一般用于类型转换,得到dict.list.tuple例: dic_str = ''{'a':1,'b':2}' ...
-
day29 二十九、元类、单例
一.eval.exec内置函数 1.eval函数 eval内置函数的使用场景: ①执行字符串会得到相应的执行结果 ②一般用于类型转换得到dict.list.tuple等 2.exec函数 exec应用 ...
-
Python:Day29 信号量、条件变量
信号量:semaphore 信号量是用来控制线程并发数的.(理解:虽然GIL任意时刻都只有一个线程被执行,但是所有线程都有资格去抢,semaphore就是用来控制抢的GIL的数量,只有获取了semap ...
-
day29 网络编程
网络通信原理: http://www.cnblogs.com/linhaifeng/articles/5937962.html 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络 ...
-
day29单例模式的4种实现模式
单例模式的四种实现模式单例模式实现方式一: import settings class MySQL: __instance=None def __init__(self, ip, port): ...
随机推荐
-
SublimeText配置NodeJS代码提示
IDE选择 最近开始研究node.js.在网上资料显示使用WebStorm开发好像是最理想的选择,但由于其需要收费.笔者选择使用Sublime Text开发.至于破解方法网络有一大堆资料,笔者此处就略 ...
-
aspx页面与服务器控件间运行原理
一.进入服务器控件以及aspx页面前,必须的准备: a)在WebForm 中只要带有runat="server" 那么那就是一个控件. b)如果form有runat="s ...
-
01.安装Memcached
1.安装Memcached 1.下载Memcached及其依赖 下载memcached-1.4.24.tar.gz和libevent-2.0.22-stable.tar.gz文件并解压如下: [liz ...
-
WebSphere配置数据库连接池
通过WebSphere配置数据库连接池一共需要三项: 1.配置连接驱动,在这里叫:JDBC提供程序; 2.配置数据库连接池,在这里叫:配置数据源; 3.配置数据库登录帐号,密码,在这里 ...
-
浏览器访问php脚本通过sendmail用mail函数发送邮件
前几天做项目遇到这样的一个问题:当某一个结点下有新的文章发表的时候,以邮件的形式通知该结点下的所有用户.这就需要用到邮件发送的功能. 因为项目是php语言做的,所以最简单的方法就是使用php自带的函数 ...
-
如何使用Handler
什么是Handler? Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联.每个Handler的实例都关联了一个线程和线程的消息队列.当创建 ...
-
谈谈java虚拟机
本文可作为北京圣思元深入java虚拟机的课堂笔记. 先看一个令人dan teng的面试题 public class Singleton { public static Singleton s=new ...
-
zsh: command not found cnpm,gulp等命令在zsh终端上报错的问题
以cnpm包为例,使用 npm install -g cnpm 创建了cnpm包.而在zsh终端上运行cnpm,出现 zsh: command not found: cnpm 的报错.同样的,gulp ...
-
spring中xml配置方式和注解annoation方式(包括@autowired和@resource)的区别
xml文件中配置itemSqlParameterSourceProvider是可以的: <bean id="billDbWriter" class="com.aa. ...
-
webkit开源项目
WebKitOpen Source Web Browser Engine Blog Downloads Feature Status Reporting Bugs Contribute Getting ...