反射

通过字符串映射或修改程序运行时的状态、属性、方法。python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

hasattr(obj,name_str) , 判断一个对象obj里是否有对应的name_str字符串的方法
getattr(obj,name_str), 根据字符串去获取obj对象里的对应的方法的内存地址
setattr(x,'y',v),设置作用  相当于 ``x.y = v''  相当于对象.'字符串'=方法    setattr(d,talk,bulk) #d.talk = bulk  动态装入bulk方法
delattr

class Dog(object):
def __init__(self,name):
self.name = name def eat(self):
print("%s is eating..."%self.name) d = Dog("NiuHanYang")
choice = input(">>:").strip() if hasattr(d,choice):
getattr(d, choice)() #输入eat --->choice=eat 调用 输出NiuHanYang is eating...

如果输入的chioce是静态属性  那么不用加上()调用

传参数

class Dog(object):
def __init__(self,name):
self.name = name def eat(self,food):
print("%s is eating..."%self.name,food) d = Dog("NiuHanYang")
choice = input(">>:").strip() if hasattr(d,choice):
func = getattr(d, choice)
func("包子")
#输入eat 输出NiuHanYang is eating... 包子

动态装入bulk方法

def bulk(self):  #在类外写入的一个方法
print("%s is yelling...." %self.name) class Dog(object):
def __init__(self,name):
self.name = name def eat(self,food):
print("%s is eating..."%self.name,food) d = Dog("NiuHanYang")
choice = input(">>:").strip() if hasattr(d,choice):
func = getattr(d, choice)
func(‘包子’)
else:
setattr(d,choice,bulk) #相当于d.talk = bulk
d.talk(d) #调用bulk 输入talk( 仅仅是字符串表示)
输出 NiuHanYang is yelling....

删除

delattr(d, choice)
print(d.name) -------->xx

总结实例:

class Foo(object):

    def __init__(self):
self.name = 'wupeiqi' def func(self):
return 'func' obj = Foo() # #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func') # #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func') # #### 设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')

异常

1、异常基础

在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面

try:
pass
except Exception as e:
pass

需求:将用户输入的两个数字相加

while True:
num1 = raw_input('num1:')
num2 = raw_input('num2:')
try:
num1 = int(num1)
num2 = int(num2)
result = num1 + num2
except Exception as e:
print ('出现异常,信息如下:')
print (e)

2、异常种类

python中的异常种类非常多,每个异常专门用于处理某一项异常!!!

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它

实例:

dic = ["wupeiqi", 'alex']
try:
dic[10]
except IndexError as e:
print (e)
dic = {'k1':'v1'}
try:
dic['k20']
except KeyError as e:
print(“没有这个Key”,e) ----->e 为错误的具体信息 没有这个key 'k20'
s1 = 'hello'
try:
int(s1)
except ValueError as e:
print (e)

对于上述实例,异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

# 未捕获到异常,程序直接报错

s1 = 'hello'
try:
int(s1)
except IndexError as e:
print (e)

所以,写程序时需要考虑到try代码块中可能出现的任意异常,可以这样写:

s1 = 'hello'
try:
int(s1)
except IndexError as e:
print (e)
except KeyError as e:
print (e)
except ValueError as e:
print (e)
s1 = 'hello'
try:
int(s1)
except (IndexError ,KeyError) as e:
print (e)

万能异常

在python的异常中,有一个万能异常:Exception,他可以捕获任意异常  抓所有未知的错误

Exception :抓住所有错误,不建议用

s1 = 'hello'
try:
int(s1)
except Exception as e:
print (e)

对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行。

s1 = 'hello'
try:
int(s1)
except KeyError as e:
print ('键错误')
except IndexError as e:
print ('索引错误')
except Exception as e:
print ('错误')

3、异常其他结构

try:
# 主代码块
pass
except KeyError,e:
# 异常时,执行该块(有错误)
pass
else:
# 主代码块执行完,执行该块(正常运行)
pass
finally:
# 无论异常与否,最终执行该块(必须执行)
pass

4、主动触发异常

try:
raise Exception('错误了。。。')
except Exception as e:
print (e)

5、自定义异常

class WupeiqiException(Exception):

    def __init__(self, msg):
self.message = msg def __str__(self): # __str__方法 在打印 对象 时,默认输出该方法的返回值。
return self.message
        ###return "dfvfdbvfgbfb"
try: 
raise WupeiqiException('我的异常') #raise触发 msg=self.message='我的异常'
except WupeiqiException as e:
print (e) ----------》我的异常
###----------》dfvfdbvfgbfb

6、断言

# assert 条件
assert 1 == 1
assert 1 == 2

try :
code
except (Error1,Erro2) as e:
print e

except Exception :抓住所有错误,不建议用

反射&异常的更多相关文章

  1. C#高级编程笔记(11至16章)异步/托管/反射/异常

    11.1.2LINQ语句 LINQ查询表达式以from子句开始,以select或者group子句结束.在这两个子句之间可以跟零个或者多个from.let.where.join或者orderby子句. ...

  2. 面对对象4 Mixins机制 内置方法 反射 异常

    Mixins机制 为什么要有:子类继承父类的时候,可能会碰到需要继承多个父类的情况,那么继承关系也分主类和辅类,既保持主类的功能,也有辅类的功能. 命名方式,我们需要将主类和辅类区分开来,python ...

  3. luogg_java学习_10_异常_反射

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 异常_反射 异常 异常就是导致程序中断执行的一段指令流 ...

  4. [Think In Java]基础拾遗2 - 多态、反射、异常、字符串

    目录 第八章 多态第十四章 类型信息第十二章 通过异常处理错误第十三章 字符串 第八章 多态 1. 前期绑定 & 后期绑定 绑定是指将方法调用同一个方法主体关联起来的这么一个过程.如果在程序执 ...

  5. python——面向对象篇之异常和反射

    内置函数isinstance和issubclass 1.1 isinstance用法: isinstance(string,str) 判断第一个参数是否是第二个参数的子集,例如: print isin ...

  6. VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决

    VS2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选 ...

  7. pythond对象、异常、反射的学习笔记

    python多继承,刚开始我是表示惊讶的,毕竟学的php,哪来的多继承?顶多也就是利用接口模拟多继承后者使用反射机制实现.那么还是来看看python的强大吧 1 首先,Python的类继承了多个类,那 ...

  8. python 异常 反射

    异常 反射 一.异常处理: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError ...

  9. 处理异常、常用类、反射、类加载与垃圾回收、java集合框架

    异常处理概述 检查异常:检查异常通常是用户错误或者不能被程序员所预见的问题.(cheched) 运行时异常:运行时异常是一个程序在运行过程中可能发生的.可以被程序员避免的异常类型.(Unchecked ...

随机推荐

  1. RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例

    pom文件: <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artif ...

  2. iOS Workflow 分享 - Create QR Code

    上次我分享了一个 Scan QR Code 的 Workflow,这次我分享一个正好相反的.如果我要分享一个 URL(或者是一段非常短的文本)给别人,我就可以用这个 Workflow 来生成 QR C ...

  3. MySQL锁表查询SQL

    // 查看进程 SHOW PROCESSLIST; // 查看是否锁表 SHOW OPEN TABLES WHERE In_use > 0; // 查看正在锁的事务 SELECT * FROM ...

  4. JSP页面的注释细节

    业务场景:通过后台传参,jstl标签控制一个页签是否显示,不过现在要去掉判断,直接让页签显示 在sublime直接这样注释,然后刷新,一直找不到标签显示,其它的都是正常的 <!--<c:i ...

  5. iOS13 新特性简介

    目录 一.Dark Mode 暗黑模式 二.Status Bar更新 三.UIActivityIndicatorView加载视图 四.总结 一.Dark Mode 暗黑模式 1.1 iOS13推出了D ...

  6. SEO-------- 了解

    SEO(Search Engine Optimization) 译为:搜索引擎优化,是一种透过了解搜索引擎的运作规则来调整网站,以及提高目的的网站在有关搜索引擎内的排名方式. 目的:为了让用户更快的搜 ...

  7. python threading ThreadPoolExecutor

    线程池,为什么要使用线程池:1. 线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值2. 当一个线程完成的时候我们主线程能立即知道3. futures可以让多线程和多进程编码接口一致 获取 ...

  8. AngleSharp 实战(05)之遍历内部子元素(x)元素,尝试着获取元素的 Attr 和 InnerText

    直接贴代码了: using System; using System.Linq; using System.Threading.Tasks; using AngleSharp; using Angle ...

  9. MySQL for OPS 02:SQL 基础

    写在前面的话 上一节主要谈谈 MySQL 是怎么安装的以及最简单的初始化我们应该做哪些配置.其中也用到了一些简单的用户操作 SQL,所以这一节主要学习常用的 SQL 使用. SQL 介绍 在了解 SQ ...

  10. C# - VS2019 WinFrm程序调用ZXing.NET实现条码、二维码和带有Logo的二维码的识别

    前言 C# WinFrm程序调用ZXing.NET实现条码.二维码和带有Logo的二维码的识别. ZXing.NET导入 GitHub开源库 ZXing.NET开源库githib下载地址:https: ...