1.检查继承

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

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

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

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

2.反射

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

  1. class Foo:
  2. def __init__(self,name,age):
  3. self.name=name
  4. self.age=age
  5. def show(self):
  6. return "%s-%s"%(self.name,self.age)
  7.  
  8. obj=Foo('greg',18)
  9. print(obj.name) #greg
  10. b="name"
  11. print(obj.__dict__) #{'name': 'greg', 'age': 18}
  12. print(obj.__dict__['name'])#greg
  13. print(obj.__dict__[b])#greg
  14.  
  15. inp=input('>>>')
  16. #去什么东西里面获取什么内容
  17. v=getattr(obj,inp)
  18. print(v)

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

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

  1. class Foo(object):
  2. def __init__(self):
  3. self.name = 'gregory'
  4.  
  5. # 不允许使用 obj.name
  6. obj = Foo()
  7. print(obj.name)
  8. print(obj.__dict__['name'])
  9. print(getattr(obj, 'name'))

3.对象的嵌套

  1. class F1:
  2. def __init__(self):
  3. self.name="greg"
  4. class F2:
  5. def __init__(self,a): #a=f1=[name=greg]
  6. self.age=a
  7. class F3:
  8. def __init__(self,b):#b=f2=[age=name=greg]
  9. self.dd=b
  10.  
  11. f1=F1()#[name=greg]
  12. f2=F2(f1)#[age=name=greg]
  13. f3=F3(f2)#[dd=[age=name=greg]]
  14. # print(f3.dd) #<__main__.F2 object at 0x00000232ACA612B0>
  15. # print(f3.dd.age) #18
  16. print(f3.dd.age.name) #greg

4.异常(exception object)

4.1一些重要的内建异常

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

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

4.3 主动触发异常

  1. try:
  2. #主动触发异常
  3. raise Exception('不过了……')
  4. except Exception as e:
  5. print(e)

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

4.4 捕捉异常写到日志

  1. def db():
  2. # return True
  3. return False
  4. def index():
  5. try:
  6. r=input(">>")
  7. int(r)
  8. result=db()
  9. if not result:
  10. raise Exception('数据库处理错误')
  11. except Exception as e:
  12. str_error=str(e)
  13. print(str_error)
  14. #打开文件,写错误记录日志
  15. r=open('log','a')
  16. r.write(str_error)
  17. index()

4.5 自定义异常

  1. class Gregerror(Exception):
  2. def __init__(self,msg):
  3. self.message=msg
  4. def __str__(self):
  5. return self.message
  6.  
  7. # obj=Gregerror('xxx')
  8. # print(obj)
  9.  
  10. try:
  11. raise Gregerror("我错了……")
  12. except Gregerror as e:
  13. print(e) #e对象的__str__方法,获取返回值

4.6 断言

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

4.7单例模式

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

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

  1. class Foo:
  2. __v=None
  3.  
  4. @classmethod
  5. def get_instance(cls):
  6. if cls.__v:#如果它有值
  7. return cls.__v
  8. else:
  9. cls.__v=Foo()
  10. return cls.__v
  11. #不要再使用 类()
  12. obj=Foo.get_instance() #obj=创建的对象
  13. print(obj)
  14.  
  15. obj2=Foo.get_instance()
  16. print(obj2)
  17.  
  18. obj3=Foo.get_instance()
  19. print(obj3)
  20.  
  21. # <__main__.Foo object at 0x000001B5A30E10F0>
  22. # <__main__.Foo object at 0x000001B5A30E10F0>
  23. # <__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. Linux基础:用tcpdump抓包

    简介 网络数据包截获分析工具.支持针对网络层.协议.主机.网络或端口的过滤.并提供and.or.not等逻辑语句帮助去除无用的信息. tcpdump - dump traffic on a netwo ...

  2. oracle如何连接别人的数据库,需要在本地添加一些配置

    2.oracle如何连接别人的数据库,需要在本地添加一些配置 1.找到 listener.ora 文件,打开(一般在 C 文件夹) ORCL = (DESCRIPTION = (ADDRESS = ( ...

  3. javascript中的双向绑定

    阅读目录 一:发布订阅模式实现数据双向绑定 二:使用Object.defineProperty 来实现简单的双向绑定. 前言: 双向数据绑定的含义:可以将对象的属性绑定到UI,具体的说,我们有一个对象 ...

  4. EditText禁用系统键盘,光标可以继续使用

    在项目中有时候需要使用到自己的键盘,那这个时候就不希望系统键盘在弹出,而且光标还要继续显示,其实一个方法就可以简单实现 /** * 禁止Edittext弹出软件盘,光标依然正常显示. */ publi ...

  5. 将Maven的Web项目部署到windows的Tomcat里

    这里我用的是win7和tomcat8,且tomcat8下载的是压缩包而非安装文件. 第一步:先将tomcat8安装服务,cmd里更改目录为tomcat8(即压缩包解压后的那个文件夹)的bin文件夹, ...

  6. golang 如何验证struct字段的数据格式

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/125 假设我们有如下结构体: type User struct ...

  7. @Data 注解引出的 lombok 小辣椒

    今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁. 这个注解来自于 lombok,lombok 能够减少大量的模板代码,减少了在使用 ...

  8. LAMP第二部分apache配置

    课程大纲:1. 下载discuz! mkdir /data/wwwcd /data/wwwwget  http://download.comsenz.com/DiscuzX/3.2/Discuz_X3 ...

  9. Java 包装类Integer的值比较

    对于包装类型Integer的值比较与int的值比较是不同的:   public class Java_Val_Compare { public static void main(String[] ar ...

  10. qt中线程的使用方法

    QT中使用线程可以提高工作效率. 要使用线程要经过一下四个步骤: (1)先创建一个c++ class文件,记得继承Thread,创建步骤如下: a.第一步 b.第二步 (2)自定义一个run函数,以后 ...