day29

时间:2022-09-26 09:22:33

今日内容:

  异常处理

  元类介绍

  元类(通过元类中的__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. SublimeText配置NodeJS代码提示

    IDE选择 最近开始研究node.js.在网上资料显示使用WebStorm开发好像是最理想的选择,但由于其需要收费.笔者选择使用Sublime Text开发.至于破解方法网络有一大堆资料,笔者此处就略 ...

  2. aspx页面与服务器控件间运行原理

    一.进入服务器控件以及aspx页面前,必须的准备: a)在WebForm 中只要带有runat="server" 那么那就是一个控件. b)如果form有runat="s ...

  3. 01&period;安装Memcached

    1.安装Memcached 1.下载Memcached及其依赖 下载memcached-1.4.24.tar.gz和libevent-2.0.22-stable.tar.gz文件并解压如下: [liz ...

  4. WebSphere配置数据库连接池

    通过WebSphere配置数据库连接池一共需要三项:     1.配置连接驱动,在这里叫:JDBC提供程序;    2.配置数据库连接池,在这里叫:配置数据源;  3.配置数据库登录帐号,密码,在这里 ...

  5. 浏览器访问php脚本通过sendmail用mail函数发送邮件

    前几天做项目遇到这样的一个问题:当某一个结点下有新的文章发表的时候,以邮件的形式通知该结点下的所有用户.这就需要用到邮件发送的功能. 因为项目是php语言做的,所以最简单的方法就是使用php自带的函数 ...

  6. 如何使用Handler

    什么是Handler? Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联.每个Handler的实例都关联了一个线程和线程的消息队列.当创建 ...

  7. 谈谈java虚拟机

    本文可作为北京圣思元深入java虚拟机的课堂笔记. 先看一个令人dan teng的面试题 public class Singleton { public static Singleton s=new ...

  8. zsh&colon; command not found cnpm&comma;gulp等命令在zsh终端上报错的问题

    以cnpm包为例,使用 npm install -g cnpm 创建了cnpm包.而在zsh终端上运行cnpm,出现 zsh: command not found: cnpm 的报错.同样的,gulp ...

  9. spring中xml配置方式和注解annoation方式&lpar;包括&commat;autowired和&commat;resource&rpar;的区别

    xml文件中配置itemSqlParameterSourceProvider是可以的: <bean id="billDbWriter" class="com.aa. ...

  10. webkit开源项目

    WebKitOpen Source Web Browser Engine Blog Downloads Feature Status Reporting Bugs Contribute Getting ...