1.检查继承

如果想要查看一个类是否是另一个类的子类,可以使用内建的issubclass函数

如果想知道已知类的基类,可以直接使用特殊特性__bases__

同时,使用isinstance方法检查一个对象是否是一个类的实例(instance)

如果想知道一个对象属于哪个类,可以使用__class__特性

2.反射

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

class Foo:
def __init__(self,name,age):
self.name=name
self.age=age
def show(self):
return "%s-%s"%(self.name,self.age) obj=Foo('greg',18)
print(obj.name) #greg
b="name"
print(obj.__dict__) #{'name': 'greg', 'age': 18}
print(obj.__dict__['name'])#greg
print(obj.__dict__[b])#greg inp=input('>>>')
#去什么东西里面获取什么内容
v=getattr(obj,inp)
print(v)

#反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
sho=getattr(obj,'show')
print(sho)#<bound method Foo.show of <__main__.Foo object at 0x000001E00C46CA58>>
sh=sho()
print(sh)#alex-18 print(hasattr(obj,'name'))#True
print(hasattr(obj,'name1'))#False setattr(obj,'k1','v1')
print(obj.k1) #v1 #obj.name
print(delattr(obj,'name')) #NONE
# obj.name

三种方式获取obj对象中的name变量指向内存中的值 “gregory”

class Foo(object):
def __init__(self):
self.name = 'gregory' # 不允许使用 obj.name
obj = Foo()
print(obj.name)
print(obj.__dict__['name'])
print(getattr(obj, 'name'))

3.对象的嵌套

class F1:
def __init__(self):
self.name="greg"
class F2:
def __init__(self,a): #a=f1=[name=greg]
self.age=a
class F3:
def __init__(self,b):#b=f2=[age=name=greg]
self.dd=b f1=F1()#[name=greg]
f2=F2(f1)#[age=name=greg]
f3=F3(f2)#[dd=[age=name=greg]]
# print(f3.dd) #<__main__.F2 object at 0x00000232ACA612B0>
# print(f3.dd.age) #18
print(f3.dd.age.name) #greg

4.异常(exception object)

4.1一些重要的内建异常

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

4.2 捕捉异常
try:
li=[11,22]
li[999] #能捕获错误
# int('d3de')#不能捕获错误
except IndexError as e:
print('IndexError',e)
except ValueError as e:
print('ValueError',e)
except Exception as e: #在python的异常中,有一个万能异常:Exception,他可以捕获任意异常
print('Exception',e)
else:
print('else')
finally: #finally语句不管try是否发生异常,都会被执行。
print('……')

4.3 主动触发异常

try:
#主动触发异常
raise Exception('不过了……')
except Exception as e:
print(e)

raise语句引发了一个没有任何有关错误的普通异常。

4.4 捕捉异常写到日志

def db():
# return True
return False
def index():
try:
r=input(">>")
int(r)
result=db()
if not result:
raise Exception('数据库处理错误')
except Exception as e:
str_error=str(e)
print(str_error)
#打开文件,写错误记录日志
r=open('log','a')
r.write(str_error)
index()

4.5 自定义异常

class Gregerror(Exception):
def __init__(self,msg):
self.message=msg
def __str__(self):
return self.message # obj=Gregerror('xxx')
# print(obj) try:
raise Gregerror("我错了……")
except Gregerror as e:
print(e) #e对象的__str__方法,获取返回值

4.6 断言

#assert条件
print(123)
assert 1==2#断言
print(456)

4.7单例模式

单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费。

对于Python单例模式,创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.get_instance() 。实例如下:

class Foo:
__v=None @classmethod
def get_instance(cls):
if cls.__v:#如果它有值
return cls.__v
else:
cls.__v=Foo()
return cls.__v
#不要再使用 类()
obj=Foo.get_instance() #obj=创建的对象
print(obj) obj2=Foo.get_instance()
print(obj2) obj3=Foo.get_instance()
print(obj3) # <__main__.Foo object at 0x000001B5A30E10F0>
# <__main__.Foo object at 0x000001B5A30E10F0>
# <__main__.Foo object at 0x000001B5A30E10F0>

Python 抽象篇:面向对象之高阶用法的更多相关文章

  1. Python高阶用法总结

    目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...

  2. Python入门篇-面向对象概述

    Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...

  3. 初学 Python(十二)——高阶函数

    初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...

  4. 当初要是看了这篇,React高阶组件早会了

    当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...

  5. python学习8—函数之高阶函数与内置函数

    python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...

  6. ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法

    NuGet包"Microsoft.AspNetCore.Diagnostics"中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户 ...

  7. python抽象篇:面向对象

    1.面向对象概述 面向过程编程:根据操作数据的函数或语句块来设计程序的. 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:数据和功能结合起来,用称为对象的东西包 ...

  8. python抽象篇:面向对象基础

    1.面向对象概述 面向过程编程:根据操作数据的函数或语句块来设计程序的. 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:数据和功能结合起来,用称为对象的东西包 ...

  9. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

随机推荐

  1. MySQL远程訪问的两个问题

    安装MySQL后,不能远程訪问.进行例如以下配置就可以 连接后,依旧不能连接,报例如以下错误: 1042 - Can't get hostname for your address 解决方法在my.i ...

  2. gulp实现公共html代码复用

    在开发网站的时候,尤其是类似于官网这样的项目,顶部都会有一个导航栏,底部会有一些其他信息,而这两个部分在每一个页面都是有的.我们不可能在每个html页面都写一遍,这样也不便后期维护等操作,所以可以把顶 ...

  3. 快看Sample代码,速学Swift语言(2)-基础介绍

    Swift语言是一个新的编程语言,用于iOS, macOS, watchOS, 和 tvOS的开发,不过Swift很多部分内容,我们可以从C或者Objective-C的开发经验获得一种熟悉感.Swif ...

  4. java表单重复提交常用解决办法

    最近在看些基础的东西,顺便做下笔记.相信大家在平时网页使用中,经常会有按钮重复点击,然后点不动刷新,还有当网络延时比较厉害点了没反应在点击的重复提交.为了避免这种情况,总结了一下4点处理方案 表单重复 ...

  5. 【adb】连接BlueStacks

    1.在任务管理器中找到

  6. 【python】type()、instance()

    >>> a=520 >>> type(a) <class 'int'> >>> a=' >>> type(a) &l ...

  7. OC学习7——类别、扩展和协议

    1.我么在调用NSLog()方法打印一个对象时,实际上是调用了该对象的description方法,这个description方法就和Java中的toString()方法一样.所以,下面两行代码其实是一 ...

  8. 小白的Python之路 day4 装饰器高潮

    首先装饰器实现的条件: 高阶函数+嵌套函数 =>装饰器 1.首先,我们先定义一个高级函数,去装饰test1函数,得不到我们想要的操作方式 import time #定义高阶函数 def deco ...

  9. ArcGIS 网络分析[2.3] 最近设施点

    什么是最近设施点? 仍然举一个生动形象例子说明. 我在大街的某一个点儿上,我急需上厕所,问:我3分钟内能到的最近的厕所在哪? 这就是最近设施点分析(ClosestFacility)--给定搜索半径,基 ...

  10. 1.sass的安装,编译,还有风格

    1.安装sass 1.安装ruby 因为sass是用ruby语言写的,所以需要安装ruby环境 打开安装包去安装ruby,记住要勾选 下面选项来配置环境路径 [x] Add Ruby executab ...