python摸爬滚打之day18----instance, type, issubclass和反射
1、issubclass(a,b) ----> 判断a是否是b的子类.
isinstance(a,b) ----> 判断a这个对象是否是b类型的(可以向上判断, 即考虑继承关系往父类判断)
type(a) ----> 获取到a对象的类型, type是不考虑继承关系的.
class Animal:
pass
class Cat(Animal):
pass
class LanCat(Cat):
pass c = Cat()
l = LanCat()
print(isinstance(Cat(),Animal)) # True 判断前者是否是后者的一个对象
print(issubclass(Cat,Animal)) # True 判断cat是不是animal的子类
isinstance
2、区分函数和类的成员方法
结论: 1, 对象访问的, 就是方法; 类名访问的, 就是函数;
2, 对于静态方法, 都是函数;
3, 对于类方法, 都是方法(任何类其实都是type类的对象,即对象访问)
from types import FunctionType, MethodType
print( isinstance(xxx, FunctionType) )
print( isinstance(xxx, MethodType) )
3、反射
通过字符串的形式从对象中动态的获取成员.
hasattr(obj,str) ----> 判断obj中是否有str成员(最常用)
getattr(obj,str) ----> 从obj中获取str成员(最常用)
setattr(obj,str,new) ----> 将obj中的str进行重写, 重写内容为new内容
delattr(obj,str) ----> 删除obj中的str成员
说明:
以上操作都是对内存中的文件进行修改的, 并不会影响源代码.
class Base:
base = "父类的"
def chi(self):
print("吃的开心")
def he(self):
print("喝的好撑") class Sclass(Base):
son = "子类的"
def __init__(self,name):
self.name = name
def wan(self):
print("玩得舒服")
p = Sclass("防滑链") print(getattr(p,"name"))
print(getattr(p,"son"))
print(getattr(Sclass,"son"))
print(getattr(p,"base"))
print(getattr(Base,"base")) print(getattr(p,"wan")) # 从对象里找,找到的是wan()方法的内存地址
print(getattr(Sclass,"wan")) # 从类里找,找到的是wan()函数的内存地址.
print(getattr(p,"wan")()) # 如果想反射到别的.py文件,就必须导入 "import py文件名" ,getattr(py文件名.类名,str)
反射
反射的另类用法: 通过字符串导入模块(原理不是反射, 只是有步骤用到了反射)
path = "字符串导入模块.example.fanshe" # 模块路径
import importlib
inp = input("请输入要查看的类别[f1,f2,f3]: ")
m = importlib.import_module(path) # 通过字符串的形式来导入模块
if hasattr(m.Cate,inp): # m.Cate, 即inp是否在类的成员方法里面, 不能写直接写m, 找不到的
obj = m.Cate() # 创建obj对象
print(getattr(obj,inp)())
else:
print("不存在此类别.")
通过字符串导入模块
python摸爬滚打之day18----instance, type, issubclass和反射的更多相关文章
- python基础之类的isinstance与issubclass、反射
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo: pass o ...
- python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用
内容梗概: 1. isinstance, type, issubclass 2. 区分函数和方法 3. 反射(重点) 4. md5加密 1. isinstance, type, issubclass1 ...
- Python学习路程day18
Python之路,Day18 - Django适当进阶篇 本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣和效 ...
- Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法
Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...
- python matplotlib画图产生的Type 3 fonts字体没有嵌入问题
ScholarOne's 对python matplotlib画图产生的Type 3 fonts字体不兼容,更改措施: 在程序中添加如下语句 import matplotlib matplotlib. ...
- Python之路,Day18 - 开发一个WEB聊天来撩妹吧
Python之路,Day18 - 开发一个WEB聊天来撩妹吧 本节内容: 项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个 ...
- isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)
6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...
- 面向对象(五)——isinstance与issubclass、反射、内置方法
isinstance与issubclass.反射.内置方法 一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,cla ...
- python全栈开发day23-面向对象高级:反射(getattr、hasattr、setattr、delattr)、__call__、__len__、__str__、__repr__、__hash__、__eq__、isinstance、issubclass
一.今日内容总结 1.反射 使用字符串数据类型的变量名来操作一个变量的值. #使用反射获取某个命名空间中的值, #需要 #有一个变量指向这个命名空间 #字符串数据类型的名字 #再使用getattr获取 ...
随机推荐
- SNF框架及机器人2018年1-9月份升级内容
1月 增加评星控件.年月选择控件 完善表格弹框的封装,增加多选弹框 的封装 增加表格 单元格合并.列头必填与可填写的标识 4月 关于分页查询和排序的各种修改(扶额) 导入excel优化 bs计算合计的 ...
- mybatis中设置打印sql语句application.yml
在application.yml配置文件中,找到数据源设置,添加: mybatis: configuration: log-impl:org.apache.ibatis.logging.stdout. ...
- jQuery雷达扫描切换幻灯片代码
基于jQuery雷达扫描切换幻灯片代码.这是一款切换效果类似雷达扫描,支持鼠标滚轮滚动切换.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class=" ...
- Diffuse贴图+Lightmap+Ambient
shader里面光照计算毕竟还是比较复杂的,于是想到下面的性能相对好一些的方案. 美术提供一张Diffuse贴图,一张lightmap贴图,然后在应用一个自定义的全局的环境光效果,来模拟静态的光照. ...
- C#编程高并发的几种处理方法
并发(英文Concurrency),其实是一个很泛的概念,字面意思就是“同时做多件事”,不过方式有所不同.在.NET的世界里面,处理高并发大致有以下几种方法: 1,异步编程 异步编程就是使用futur ...
- name转json
^(\{)?(?<=\n)(.*)(\})?$ "$2":"", UserId UserOrderId ChargeAccount BuyNum Good ...
- Flutter & Dart 安装在window系统
一.系统环境 flutter最低要求 1,windows7 SP1 64位版本以上,我的系统就是windows 7 sp1 64bit 2,git for windows ,没有安装的需要到这里下载 ...
- phpstudy 500 Internal Server Error 解决办法
版本:phpstudy 2018 报错:500 Internal Server Error 原因:手动选择路径的时候,产生了斜杠不同 (正确:"D:/phpStudy/PHPTutoria ...
- Qt中关于QMouseEventbuttons()和QMouseEventbutton()的使用注意
在进行QT程序开发中经常需要响应鼠标事件,在QWidget或QMainWindow的子类中可以重载如下鼠标事件实现自己需要的效果. virtual void mouseDoubleClickEvent ...
- C# 鼠标移动Winform窗体内或者panel容器内的控件 显示虚线/实现虚线框来确定位置
C# 鼠标移动WinForm窗体或者panel容器内的控件 移动虚线/实现虚线框来确定位置 1.用到的方法介绍 今天,根据领导指示指导移动容器内的控件,生成虚线框,使用 ControlPaint.Dr ...