一 isinstance(obj,cls)和issubclass(sub,super)

isinstance(obj,cls)检查是否obj是否是类 cls 的对象

class Foo:

pass

obj = Foo()

print(isinstance(obj,Foo))

issubclass(sub, super)检查sub类是否是 super 类的派生类

class Foo:

pass

class Bar(Foo):

pass

print(issubclass(Bar,Foo))

二 反射

1、什么是反射

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

2、python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

基于对象级别的反射

基于类级别的反射

基于模块级别的反射

四个可以实现自省的函数:

def hasattr(*args, **kwargs): #real signature unknown

"""Return whether the object has an attribute with the given name.

This is done by calling getattr(obj, name) and catching AttributeError."""

pass

#检测是否含有某属性

hasattr(object,name)

def getattr(object, name, default=None): #known special case of getattr

"""getattr(object, name[, default]) -> value

Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.

When a default argument is given, it is returned when the attribute doesn't

exist; without it, an exception is raised in that case."""

pass

#获取属性

getattr(object, name, default=None)

def setattr(x, y, v): #real signature unknown; restored from __doc__

"""Sets the named attribute on the given object to the specified value.

setattr(x, 'y', v) is equivalent to ``x.y = v''"""

pass

#设置属性

setattr(x, y, v)

def delattr(x, y): #real signature unknown; restored from __doc__

"""Deletes the named attribute from the given object.

delattr(x, 'y') is equivalent to ``del x.y''"""

pass

#删除属性

delattr(x, y)

使用演示:

classPeople:

country='China'

def __init__(self,name):

self.name=namedefwalk(self):print('%s is walking'%self.name)

p=People('egon')print(People.__dict__)print(p.name)print(p.__dict__)#----------------------

#hasattr

print('name' in p.__dict__)print(hasattr(p,'name'))print(hasattr(p,'name1213'))print(hasattr(p,'country')) #p.country #基于对象

print(hasattr(People,'country')) #People.country #基于类

print(hasattr(People,'__init__')) #People.__init__

#----------------------

#getattr

res=getattr(p,'country') #res=p.country

print(res)

f=getattr(p,'walk') #t=p.walk

print(f)

f1=getattr(People,'walk')print(f1)

f()

f1(p)print(p.xxxxxxx)print(getattr(p,'xxxxxxxx','这个属性确实不存在'))if hasattr(p,'walk'):

func=getattr(p,'walk')

func()print('================>')print('================>')#----------------------

#setattr

p.sex='male'

print(p.sex)print(p.__dict__)

setattr(p,'age',18)print(p.__dict__)print(p.age)print(getattr(p,'age'))

四大金刚

#反射当前模块的属性

importsys

x=1111

classFoo:pass

defs1():print('s1')defs2():print('s2')#print(__name__)

this_module= sys.modules[__name__]print(this_module)print(hasattr(this_module, 's1'))print(getattr(this_module, 's2'))print(this_module.s2)print(this_module.s1)

大力丸

模块补充:

__name__可以区别文件的用途:

一种用途是直接运行文件,这叫把文件当成脚本运行。

一种用途是不运行文件,在另一个文件中导入这个模块。

3、反射的用途

importsysdefadd():print('add')defchange():print('change')defsearch():print('search')defdelete():print('delete')

func_dic={'add':add,'change':change,'search':search,'delete':delete

}whileTrue:

cmd=input('>>:').strip()if not cmd:continue

if cmd in func_dic: #hasattr()

func=func_dic.get(cmd) #func=getattr()

func()

实例一

importsysdefadd():print('add')defchange():print('change')defsearch():print('search')defdelete():print('delete')

this_module=sys.modules[__name__]whileTrue:

cmd=input('>>:').strip()if not cmd:continue

ifhasattr(this_module,cmd):

func=getattr(this_module,cmd)

func()

使用反射来实现:实例一

好处一:实现可插拔机制

反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能

模拟FTP功能:

classFtpClient:'ftp客户端,但是还么有实现具体的功能'

def __init__(self,addr):print('正在连接服务器[%s]' %addr)

self.addr=addrdeftest(self):print('test')defget(self):print('get------->')

ftpclient.py

importftpclient#print(ftpclient)#print(ftpclient.FtpClient)#obj=ftpclient.FtpClient('192.168.1.3')

#print(obj)#obj.test()

f1=ftpclient.FtpClient('192.168.1.1')if hasattr(f1,'get'):

func=getattr(f1,'get')

func()else:print('-->不存在此方法')print('其他逻辑')

ftpserver.py

好处二:动态导入模块(基于反射当前模块)

#m=input("请输入你要导入的模块:")

#m1=__import__(m)#print(m1)#print(m1.time())

#推荐使用方法

importimportlib

t=importlib.import_module('time')print(t.time())

通过字符串导入模块

issubclass在python中的意思_python基础之类的isinstance与issubclass、反射相关推荐

  1. python中factor函数_Python基础教程

    6.4.5 参数收集的逆过程 假设有如下函数: def add(x,y): return x+y 比如说有个包含由两个相加的数字组成的元组: params = (1,2) 使用*运算符对参数进行&qu ...

  2. python中列表数据类型_python基础数据类型一(列表)

    列表 列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. 比如JS中的数 组, java中的数组等等. 它是以[ ]括起来, 每个元素用' , '隔开而且可以存放各种数据类型: ...

  3. python中符号输入_Python基础(输入、运算符)

    输入 1. python2版本中 1.1 使用 raw_input()函数, 看如下示例: password = raw_input("请输入密码:") print ('您刚刚输入 ...

  4. python中ijust函数_Python基础

    脚本运行Windows 下需将python加入的系统变量中: Linux 下需添加头部#! /usr/bin/enc python print('Hello World!') 循环 for 循环 fo ...

  5. python中fac函数_Python基础复习函数篇

    目录 1.猴子补丁 2. global和nonlocal关键字 3.迭代器和生成器 4.递归函数 5.高阶函数和lamdba函数 6.闭包 7.装饰器 1.   猴子补丁 猴子补丁主要用于在不修改已有 ...

  6. middles在python中什么意思_Python 基础知识入门(2)

    字符串格式化 Python字符串格式化有两种方式:百分号方式.format方式: 百分号的方式相对比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并在: 一.百分号方式 %[ ...

  7. python中function函数_Python基础---函数Function

    函数Function 定义:带名字的代码块,用于完成具体的工作 最基本的一种代码抽象的方式,借助函数,可以不用关心底层的具体计算过程,直接在更高层次上思考问题 在Python中,内置了多种多样的函数, ...

  8. [转载] issubclass在python中的意思_python issubclass 和 isinstance函数

    参考链接: Python issubclass() Python issubclass() 函数 issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类. ...

  9. python中globals用法_Python基础教程之内置函数locals()和globals()用法分析

    本文实例讲述了Python基础教程之内置函数locals()和globals()用法.分享给大家供大家参考,具体如下: 1. 这两个函数主要提供,基于字典的访问局部变量和全局变量的方式. python ...

最新文章

  1. Quartz.Net—配置化
  2. php分页功能乱码了怎么办,51、PHP文件内容分页操作,避免乱码
  3. mysql子查询查询子字段_MySQL知识整理7.4—子查询
  4. CVPR 2021 论文分享会预告
  5. 现在有什么开源的语音识别吗?
  6. RabbitMQ之安装windows
  7. 太阳高度角计算题_太阳高度角计算练习题
  8. RocketMQ(四)Linux搭建RocketMQ集群
  9. DTOJ #1079. 多项式展开 mult
  10. 光缆接续盒图标_光缆线路施工技术(超全)
  11. Poco库完全使用手册
  12. jQuery的文档处理
  13. Java多线程 -- 深入理解JMM(Java内存模型) --(五)锁
  14. IPAD 安装win8 苏菲安装Mac OS iphone安装安卓
  15. Linux请求调页技术,linux零页技术.doc
  16. Non-parametric Classifiers
  17. Android-手机杀毒
  18. 微生物网络分析学习手稿
  19. 微型 Python Web 框架: Bottle
  20. 毕业设计 单片机(stm32)远程宠物喂养系统 - 物联网 esp8266

热门文章

  1. 数字逻辑基础与verilog设计_数字电路学习笔记(五):逻辑设计基础
  2. 无穷大正整数 python_python模块:数字处理
  3. python中_str_使用方法
  4. Python基础(一)--初识Python
  5. 平行空间怎么设置32位_高低床怎么设置不占空间
  6. 别再搞纯文本了!多模文档理解更被时代需要!
  7. ICML2020 | 一行代码就能实现的测试集上分技巧
  8. 微服务设计原则和解决方案
  9. Android官方开发文档Training系列课程中文版:Android的安全建议
  10. Android官方开发文档Training系列课程中文版:APP的内存管理