面对对象4 Mixins机制 内置方法 反射 异常
Mixins机制
为什么要有:子类继承父类的时候,可能会碰到需要继承多个父类的情况,那么继承关系也分主类和辅类,既保持主类的功能,也有辅类的功能。
命名方式,我们需要将主类和辅类区分开来,python 对于mixin类的命名方式一般以 Mixin, able, ible 为后缀,然后一般按照规范,调用的时候辅类应该在主类的左边。
class Vehicle: # 交通工具
pass
class FlyableMixin:
def fly(self):
'''
飞行功能相应的代码
'''
print("I am flying")
class CivilAircraft(FlyableMixin, Vehicle): # 民航飞机
pass
class Helicopter(FlyableMixin, Vehicle): # 直升飞机
pass
class Car(Vehicle): # 汽车
pass
内置方法
定义在类的内部,双下划线开头并以上下划线结尾的方法
它的特点是,在某种情况下会自动触发执行
为了定制化我的类或者对象
str内置方法
# __str__下面return什么,打印对象就会打印出来什么,但返回值必须是str类型才可以,否则会报错,当然,这个内置方法里如果有代码,也会在打印对象的时候,触发执行
class People():
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return '名字:%s 年龄:%s'%(self.name,self.age)
obj = People('jesse','13')
print(obj)
# 输出结果 名字:jesse 年龄:13
del内置方法
# 在删除对象时触发,会先执行该方法
class People():
def __init__(self,name,age):
self.name = name
self.age = age
def __del__(self):
print('run...') # 用来标记执行了该方法
obj = People('jesse','13')
del obj
# 在程序运行完毕之后也会触发执行该方法,因为这涉及到一个内存回收机制,当这个对象的内存被回收,就相当于执行了删除操作
相对比较重要的
isinstance
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
语法:isinstance(object, classinfo)
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
a = 2
isinstance (a,int)
# True
isinstance (a,str)
# False
isinstance (a,(str,int,list)) # 是元组中的一个返回 True
# True
issubclass
issubclass()方法用于判断参数 class 是否是类型参数 classinfo 的子类
语法:issubclass(class, classinfo)
- class -- 类。
- classinfo -- 类。
如果 class 是 classinfo 的子类返回 True,否则返回 False。
class A:
pass
class B(A):
pass
print(issubclass(B,A))
# 返回 True
getattr方法
# __getattr__方法
# 访问类或者对象里面的一个属性,如果不存在就会执行该方法,且会同时默认返回None,可以设置返回值
class Foo:
x = 1
def __init__(self, y):
self.y = y
def __getattr__(self,item):
print('from getattr==>属性不存在')
setattr方法
为对象设置值的时候触发,对象中属性中有值的时候也会触发
delattr方法
删除值的时候触发
call方法
calss Foo:
def __init__(self):
pass
def __call__(self,*args,**kwargs):
print('__call__')
obj = Foo()
obj()
# 输出 __call__
# 在对象加括号到用的时候就会执行__call__方法
greater than 大于 python中简写成 gt
less than 小于 python中简写成 lt
equal 等于 e
大于等于 gte
小于等于 lte
反射
python是动态语言,而反射(reflection)机制被视为动态语言的关键。
反射机制指的是在程序的运行状态中
对于任意一个类,都可以知道这个类的所有属性和方法;
对于任意一个对象,都能够调用他的任意方法和属性。
这种动态获取程序信息以及动态调用对象的功能称为反射机制
简而言之就是通过字符串来操作类方法
getattr
class Student(): school = 'Beijing' obj = Student()print(getattr(obj,'school',None))# 获取对象中的属性 对象名,属性名字符串形式,没有的话返回值
hasattr
class Student(): school = 'Beijing' obj = Student()print(hasattr(obj,'school'))# 判断对象中有没有该属性 有的话返回 True 没有返回False
setattr
class Student(): school = 'Beijing' obj = Student()setattr(obj, 'x', 100)print(obj.__dict__)# 输出结果 {'x': 100}# 更改值
delattr
# delattr 函数用于删除属性# delattr(obj, 'x') 相等于 del obj.xclass Student(): school = 'Beijing' obj = Student()delattr(Student,'school')
扩展(重要)
class Foo(): def func(self): print('func') obj = Fooprint(getattr(obj,'func')) # ==><function Foo.func at 0x1016f1670> 得到一个函数内存地址# 那么我们加括号就可以执行这个内存地址getattr(obj,'func')()# 输出结果 func
异常处理
1、什么是异常
异常是程序发生错误时的信号,程序一旦出错就会抛出异常
2、为什么要处理异常
为了增强程序的健壮性,即便程序在运行过程中出错了,也不要终止程序,而是捕捉异常并处理:将出错信息记录到日志内
3、如何处理
错误的两大来源
3.1语法上的错误
if 1 >3 print('run') # SyntaxError 语法错误 在程序运行前就改正
3.2逻辑上的错误
l = ['a','b']l[2] # 取了一个不存在的索引
针对逻辑上的异常又分成两种处理方式
错误发生是可以预知的,那我们就可以用if判断来解决该问题
如果是不可预知的,那我们必须要用异常处理语法来解决
try:
子代码块
# 有可能会抛出异常的代码
except 异常类型1 as e:
pass
except 异常类型2 as e:
pass
except Exception as e: # 万能异常
pass
...
else:
如果被检测的子代码块没有异常发生,则会执行else的子代码
finally:
不管有没有异常都会执行finally的子代码
需要注意的是 else 需要和 except 搭配使用

抛出异常
Python 使用 raise 语句抛出一个指定的异常。
raise语法格式如下:
raise [Exception [, args [, traceback]]]
# 如果x大于5就触发异常x = 10if x > 5: raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
自定义异常
你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承
class Myexception(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return "异常信息:%s" % self.msgraise Myexception("出异常了") # 再抛出异常
面对对象4 Mixins机制 内置方法 反射 异常的更多相关文章
- python-面向对象速查表-内置方法-内置函数-内置属性(只整理了部分内容)
今日临时总结的内容,可能还有些不正确的地方,初步当做个速查表吧. 类的内置函数(继承object的,自己重写) 内置函数 执行时机 注意点 调用案例 __init__ 实例化对象时 不允许写返回值(r ...
- Day 08 可变与不可变对象/列表与字典内置方法
目录 可变对象与不可变对象 可变对象 不可变对象 列表的内置方法 字典内置方法 可变对象与不可变对象 可变对象 对象指向的内存中的值会改变,当更改这个变量的时候,还是指向原来内存中的值,并且在原来的内 ...
- 铁乐学python_day24_面向对象进阶1_内置方法
铁乐学python_day24_面向对象进阶1_内置方法 题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面 ...
- day31 反射,内置方法,元类
目录 一.反射 1 什么是反射 2 如何实现反射 二.内置方法 1 什么是内置方法 2 为什么要用内置方法 3 如何使用内置方法 3.1 str 3.2 del 三.元类 1 什么是元类 2 clas ...
- JavaScript基础:BOM的常见内置方法和内置对象
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. BOM的介绍 JavaScript的组成 JavaScript基础分为三 ...
- 用JAVA编写浏览器内核之实现javascript的document对象与内置方法
原创文章.转载请注明. 阅读本文之前,您须要对浏览器怎样载入javascript有一定了解. 当然,对java与javascript本身也须要了解. 本文首先介绍浏览器载入并执行javascript的 ...
- 浏览器(BOM)对象的一些内置方法总结
浏览器(BOM)对象的一些内置方法总结 一.总结 1.bom就是浏览器那端执行的代码,dom就是服务器那端操作html的代码 2.记好bom的几个对象,那就很好理解很多代码了,也很好写很多代码了 二. ...
- js-DOM ~ 04. BOM:浏览器对象模型window. 、定时器、在线用户、祝愿墙、BOM的内置方法内置对象
multiple. select列表多选 触发事件后调用有参数的函数要先创建一个函数,然后在函数内调用执行函数 Array.from(伪数组):伪数组变为真数组 indexOf():查询字符的索引 a ...
- JavaScript---Bom树的操作,内置方法和内置对象(window对象,location对象,navigator对象,history对象,screen对象)
JavaScript---Bom树的操作,内置方法和内置对象(window对象,location对象,navigator对象,history对象,screen对象) 一丶什么是BOM B ...
随机推荐
- pixel的Edxposed刷机过程
1.先解开bl锁 这里的步骤,因为我机子本来就是解过的了,所以简单记录一下过程好了 第一步:确保你的环境变量是否设置好了,判断的标准就是打开终端(我是mac),usb连接上,然后输入 adb devi ...
- 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅
摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...
- 关闭火狐浏览器中的Pocket功能
在火狐(Firefox)浏览器中,默认右键菜单和菜单栏都会有 Pocket按钮 .但是大部分国内用户都不会使用Pocket服务,看着还十分碍眼. 在工具栏的图标还可以通过定制工具栏修改,但是右键菜单中 ...
- 「AGC029C」Lexicographic constraints
「AGC029C」Lexicographic constraints 传送门 好像这个题非常 easy. 首先这个答案显然具有可二分性,所以问题转化为如何判定给定的 \(k\) 是否可行. 如果 \( ...
- 「CF85E」 Guard Towers
「CF85E」 Guard Towers 模拟赛考了这题的加强版 然后我因为初值问题直接炸飞 题目大意: 给你二维平面上的 \(n\) 个整点,你需要将它们平均分成两组,使得每组内任意两点间的曼哈顿距 ...
- Django 接口自动化测试平台
本项目工程 github 地址:https://github.com/juno3550/InterfaceAutoTestPlatform 0. 引言 1. 登录功能 2. 项目 3. 模块 4. 测 ...
- C语言:最大公约数和最小公倍数
#include <stdio.h> int main() { int a,b,c,m,t; printf("请输入两个数:\n"); scanf("%d%d ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第九集-补充-热部署项目到tomcat中,但是数据库配置文件错误,中途停止部署,导致执行shutdow.sh报错异常: Could not contact localhost:8005. Tomcat may not be running error while shutting down】
1,经过千辛万苦的尝试和百度,终于一个博客:http://stackmirror.caup.cn/page/skxugjqj0ldc关于catalina.sh文件的执行引起了我的注意: 2,我执行ca ...
- 痞子衡嵌入式:嵌入式MCU中通用的三重中断控制设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式MCU中通用的三重中断控制设计. 我们知道在 MCU 裸机中程序代码之所以能完成多任务并行实时处理功能,其实主要是靠中断来调度的, ...
- C++:常量
/** https://www.runoob.com/cplusplus/cpp-constants-literals.html * 常量: 固定值,一旦定义不能被修改 * 整数常量:可以是十进制.八 ...