今日内容:

  异常处理

  元类介绍

  元类(通过元类中的__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. 查看linux 内存

    1.vmstat vmstat命令显示实时的和平均的统计,覆盖CPU.内存.I/O等内容.例如内存情况,不仅显示物理内存,也统计虚拟内存. $ vmstat -s 2.top top命令提供了实时的运 ...

  2. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

  3. js-JavaScript常见的创建对象的几种方式

    1.通过Object构造函数或对象字面量创建单个对象 这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为了解决这个问题,出现了工厂模式. 2.工厂模式 考虑在ES中无法创建类( ...

  4. JS 实现四舍五入保留两位小数并且添加千位分隔符

    var a = "-123456789.078";a = (Math.round(a * 100) / 100).toFixed(2).toString().replace(/(\ ...

  5. 清除input numer 点击样式

    input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; }

  6. Vue -- 项目报错整理(1):RangeError: Maximum call stack size exceeded

    这几天项目运行报了个错: Uncaught RangeError: Maximum call stack size exceeded,刚开始看到 "returnNodeParameter&q ...

  7. eclipse中如何使用struts2

    简介 这篇文章主要讲如何在eclipse中使用struts2,文章使用的struts2的版本是2.5.2,会与其他的版本有一小点的差别,文章里已经说明.例子的完整源码在文末,亲测没有任何错误. str ...

  8. 回归JavaScript基础(十)

    主题:创建对象 原型模式 JavaScript中的每个对象都有一个prototype属性(原型属性),这个属性是一个指针,指向一个对象,而这个对象可以由一些属性和方法组成.被指向的对象,可以是多个对象 ...

  9. .NET笔试题集(五)

    转载于:http://www.cnblogs.com/ForEvErNoME/archive/2012/09/15/2684938.html 1.什么是受管制的代码? 答:unsafe:非托管代码.不 ...

  10. unbuntu 安装python包提示E: Unable to locate package python-timeout

    今天本想着在unbuntu环境下安装python的一个包,安装了几次都提示 E: Unable to locate package python-timeout 查阅了一些信息才知道,原来是一些软件源 ...