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机制 内置方法 反射 异常的更多相关文章

  1. python-面向对象速查表-内置方法-内置函数-内置属性(只整理了部分内容)

    今日临时总结的内容,可能还有些不正确的地方,初步当做个速查表吧. 类的内置函数(继承object的,自己重写) 内置函数 执行时机 注意点 调用案例 __init__ 实例化对象时 不允许写返回值(r ...

  2. Day 08 可变与不可变对象/列表与字典内置方法

    目录 可变对象与不可变对象 可变对象 不可变对象 列表的内置方法 字典内置方法 可变对象与不可变对象 可变对象 对象指向的内存中的值会改变,当更改这个变量的时候,还是指向原来内存中的值,并且在原来的内 ...

  3. 铁乐学python_day24_面向对象进阶1_内置方法

    铁乐学python_day24_面向对象进阶1_内置方法 题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面 ...

  4. day31 反射,内置方法,元类

    目录 一.反射 1 什么是反射 2 如何实现反射 二.内置方法 1 什么是内置方法 2 为什么要用内置方法 3 如何使用内置方法 3.1 str 3.2 del 三.元类 1 什么是元类 2 clas ...

  5. JavaScript基础:BOM的常见内置方法和内置对象

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. BOM的介绍 JavaScript的组成 JavaScript基础分为三 ...

  6. 用JAVA编写浏览器内核之实现javascript的document对象与内置方法

    原创文章.转载请注明. 阅读本文之前,您须要对浏览器怎样载入javascript有一定了解. 当然,对java与javascript本身也须要了解. 本文首先介绍浏览器载入并执行javascript的 ...

  7. 浏览器(BOM)对象的一些内置方法总结

    浏览器(BOM)对象的一些内置方法总结 一.总结 1.bom就是浏览器那端执行的代码,dom就是服务器那端操作html的代码 2.记好bom的几个对象,那就很好理解很多代码了,也很好写很多代码了 二. ...

  8. js-DOM ~ 04. BOM:浏览器对象模型window. 、定时器、在线用户、祝愿墙、BOM的内置方法内置对象

    multiple. select列表多选 触发事件后调用有参数的函数要先创建一个函数,然后在函数内调用执行函数 Array.from(伪数组):伪数组变为真数组 indexOf():查询字符的索引 a ...

  9. JavaScript---Bom树的操作,内置方法和内置对象(window对象,location对象,navigator对象,history对象,screen对象)

    JavaScript---Bom树的操作,内置方法和内置对象(window对象,location对象,navigator对象,history对象,screen对象) 一丶什么是BOM ​      B ...

随机推荐

  1. pixel的Edxposed刷机过程

    1.先解开bl锁 这里的步骤,因为我机子本来就是解过的了,所以简单记录一下过程好了 第一步:确保你的环境变量是否设置好了,判断的标准就是打开终端(我是mac),usb连接上,然后输入 adb devi ...

  2. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  3. 关闭火狐浏览器中的Pocket功能

    在火狐(Firefox)浏览器中,默认右键菜单和菜单栏都会有 Pocket按钮 .但是大部分国内用户都不会使用Pocket服务,看着还十分碍眼. 在工具栏的图标还可以通过定制工具栏修改,但是右键菜单中 ...

  4. 「AGC029C」Lexicographic constraints

    「AGC029C」Lexicographic constraints 传送门 好像这个题非常 easy. 首先这个答案显然具有可二分性,所以问题转化为如何判定给定的 \(k\) 是否可行. 如果 \( ...

  5. 「CF85E」 Guard Towers

    「CF85E」 Guard Towers 模拟赛考了这题的加强版 然后我因为初值问题直接炸飞 题目大意: 给你二维平面上的 \(n\) 个整点,你需要将它们平均分成两组,使得每组内任意两点间的曼哈顿距 ...

  6. Django 接口自动化测试平台

    本项目工程 github 地址:https://github.com/juno3550/InterfaceAutoTestPlatform 0. 引言 1. 登录功能 2. 项目 3. 模块 4. 测 ...

  7. C语言:最大公约数和最小公倍数

    #include <stdio.h> int main() { int a,b,c,m,t; printf("请输入两个数:\n"); scanf("%d%d ...

  8. 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 ...

  9. 痞子衡嵌入式:嵌入式MCU中通用的三重中断控制设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式MCU中通用的三重中断控制设计. 我们知道在 MCU 裸机中程序代码之所以能完成多任务并行实时处理功能,其实主要是靠中断来调度的, ...

  10. C++:常量

    /** https://www.runoob.com/cplusplus/cpp-constants-literals.html * 常量: 固定值,一旦定义不能被修改 * 整数常量:可以是十进制.八 ...