一、isinstance与issubclass方法

1、isinstance是用来判断对象是否是某个类

  isinstance(obj,class)

2、issubclass是用来判断一个类是否为另一个类的子类

  issubclass(Bar,Foo)

class Foo:
pass class Bar(Foo):
pass obj = Foo()
print(isinstance(obj, Foo)) # True print(issubclass(Bar, Foo)) # True isinstance与issubclass

二、反射

1、什么是反射?

  反射:主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。

   在python面向对象中的反射,是通过字符串来操作类或者对象的属性。

使用反射的好处:1、实现可拔插机制。2、动态导入模块(基于反射当前模块成员)。

2、如何用反射?

有4个可以实现自省的函数(适用于类和对象)

hasattr(判断有没有该属性)
getattr(拿到属性)
setattr(设置属性)
delattr(删除属性)
class People:
country = 'China' def __init__(self, name):
self.name = name def eat(self):
print('%s is eating' % self.name) peo1 = People('egon') print(hasattr(peo1, 'eat')) # peo1.eat
# True
print(getattr(peo1, 'eat')) # peo1.eat
# <bound method People.eat of <__main__.People object at 0x0000000002775FD0>>
print(getattr(peo1, 'xxxxx', None))
# None
setattr(peo1, 'age', 18) # peo1.age=18
print(peo1.age)
#
print(peo1.__dict__)
# {'name': 'egon', 'age': 18} delattr(peo1, 'name') # del peo1.name
print(peo1.__dict__)

三、自定义内置方法来定制类的功能

1、__str__方法。

在类内部定义一个函数__str__,不需要任何参数,在对象被打印时自动触发,应该在方法内采集与对象self有关的信息,然后拼成字符串返回。

 1 class People:
2 def __init__(self,name,age):
3 self.name=name
4 self.age=age
5
6 def __str__(self):
7 return 'name:%s age:%s' %(self.name,self.age)
8 #自己可以设置打印格式#
9 obj=People('egon',13)
10 print(obj) #obj.__str__()

2、__del__方法。

析构方法,当对象在内存中被释放时,自动触发执行(__del__会在对象被删除之前自动触发)

class Foo:

    def __del__(self):
print('执行我啦') f1=Foo()
del f1
print('------->') #输出结果
执行我啦
------->

简单示范

3、__call__方法。

对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:

    def __init__(self):
pass def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # 执行 __init__
obj() # 执行 __call__

四、异常处理

1、什么是异常

异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),

在python中,错误触发的异常如下:

2、异常的类型

首先,异常主要分为语法错误逻辑错误两种类型

语法错误会在程序还没有执行前就会被检测出,所以针对语法错误,我们就要在程序执行前解决掉。

# 语法错误示范:
if def foo
pass class Bar:
pass

逻辑错误只有在程序执行过程中会被检测,不处理就会被抛出,导致程序终止。

3、常见的异常

在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一种错误

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

更多异常

4、异常处理

为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,

(1)如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防

AGE=10
while True:
age=input('>>: ').strip()
if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
age=int(age)
if age == AGE:
print('you got it')
break

(2)如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

 try:
print('=====1')
print('=====2')
print('=====3')
d = {'x': 1, 'y': 2}
# d['z'] # KeyError
print('=====4')
l = [1, 2, 3]
l[1000] # IndexError
print('=====5')
except (KeyError,IndexError) as e:
print(e)
print('other code')
 #基本语法为
try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑

基本语法

#1 异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
s1 = 'hello'
try:
int(s1)
except IndexError as e: # 未捕获到异常,程序直接报错
print e #2 多分支
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e) #3 万能异常Exception
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e) #4 多分支异常与万能异常
#4.1 如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么骚年,大胆的去做吧,只有一个Exception就足够了。
#4.2 如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。 #5 也可以在多分支后来一个Exception
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
except Exception as e:
print(e) #6 异常的其他机构
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
#except Exception as e:
# print(e)
else:
print('try内代码块没有异常则执行我')
finally:
print('无论异常与否,都会执行该模块,通常是进行清理工作') #7 主动触发异常
try:
raise TypeError('类型错误')
except Exception as e:
print(e) #8 自定义异常
class EgonException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg try:
raise EgonException('类型错误')
except EgonException as e:
print(e) #9 断言:assert 条件
assert 1 == 1
assert 1 == 2 #10 总结try..except 1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;

(3)、主动抛出异常

     raise Exception()

 # 主动触发异常

 print('===>1')
print('===>2')
raise TypeError('类型错误')
print('===>3')
class People:
def __init__(self,name,age):
self.__name=name
self.__age=age def tell_info(self):
print(self.__name,self.__age) def set_info(self,name,age):
if not isinstance(name,str):
raise TypeError("名字必须为字符串") if not isinstance(age,int):
raise TypeError("年龄必须为数字") obj=People("ZBS",22) obj.set_info(18,"金琦航") obj.tell_info()

5、自定义类

class MyException(BaseException):
def __init__(self,msg):
super().__init__()
self.msg=msg def __str__(self):
return "=. =!<%s>" %self.msg raise MyException("我自定义的异常")
print("上半部分,生产数据")
l=[1,2,3,4] # if len(l)!=5:
# raise Exception("列表的长度为5")
assert len(l) ==5
print("下半部分,生产数据")

断言

面向对象(五)--isinstance与issubclass方法、反射、内置方法(部分)、异常处理的更多相关文章

  1. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  2. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  3. python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)

    面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...

  4. Python面向对象 --- 类的设计和常见的内置方法

    面向对象:一种基于面向过程的新的编程思想.也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种 ...

  5. PYTHON-绑定方法 反射 内置函数

    '''绑定方法类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 如何用: 绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰 ...

  6. asp.net MVC开发过程中,使用到的方法(内置方法及使用说明)

    ® 视图的返回使用案例: [HttpGet] [SupportFilter] public ActionResult UserTopic(string type, string TopPicId, s ...

  7. Learning-Python【26】:反射及内置方法

    反射的概念 可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python 中一切皆对象,都可以使用反射. 反射有四种方法: hasattr:hasattr(object, n ...

  8. 《Python》反射、内置方法(__str__,__repr__)

    一.反射 通过字符串的形式操作对象相关的属性.(使用字符串数据类型的变量名来获取这个变量的值) Python中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...

  9. python今日分享(内置方法)

    目录 一.习题详解 二.数据类型的内置方法理论 三.整型相关操作 四.浮点型相关操作 五.字符串相关操作 六.列表相关操作 今日详解 一.习题详解 1.计算1-100所有数据之和 all_num = ...

  10. Python基础部分:9、数据的类型和内置方法

    目录 一.数据类型内置方法理论 1.什么是数据内置方法 2.如何调用数据内置方法 二.整型(int)内置方法与操作 1.类型转换 2.进制数转换 三.浮点型(float)内置方法与操作 1.类型转换 ...

随机推荐

  1. BOI 2003 团伙

    洛谷 P1892 [BOI2003]团伙 洛谷传送门 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋 ...

  2. NOIP 2009 Hankson 的趣味题

    洛谷 P1072 Hankson 的趣味题 洛谷传送门 JDOJ 1648: [NOIP2009]Hankson的趣味题 T2 JDOJ传送门 Description Hanks 博士是BT (Bio ...

  3. TCP的三次握手和四次挥手详解

    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. TCP报文格式 TCP的包如下: ...

  4. [LeetCode] 909. Snakes and Ladders 蛇梯棋

    On an N x N board, the numbers from 1 to N*Nare written boustrophedonically starting from the bottom ...

  5. Eclipse:设置自动生成注释

    一.设置自动生成 1.修改设置: 点击Window下的Preferences: 进入Java->Code Style->Code Templates的页面,选择Code下的New Java ...

  6. EF Code Frist 执行 nuget命令

    1.Enable-Migrations -EnableAutomaticMigrations2.Add-Migration InitialCreate3.Update-Database -Verbos ...

  7. win7升级win10

    win7的系统看起来不是特别爽,还是win10用得顺手. win7升级win10: https://jingyan.baidu.com/article/066074d60391e2c3c31cb04e ...

  8. Helm 常用命令及操作

    Helm 常用命令 查看版本 #helm version 查看当前安装的charts #helm list 查询 charts #helm search redis 安装charts #helm in ...

  9. Javascript笔记:作用域和执行上下文

    一.作用域 Javascript的作用域规则是在编译阶段确定的,有声明时的位置决定. JS中有全局作用域,函数作用域,块级作用域(ES6引入). 1. 全局作用域 在整个程序生命周期内都是有效的,在任 ...

  10. 剑指offer:对称的二叉树

    题目描述: 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 思路分析: 二叉树的镜像就是左右相反,对称二叉树即镜像相等.利用一个递归函数 ...