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

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
class Foo(object):
    def __init__(self,name):
        self.name = name

    def func(self):
        return "func"

obj = Foo("Jack")

一、hasattr(object,name)->bool       判断object中是否具有name属性,例如:

# 检查对象中成员
print(hasattr(obj,"name"))
print(hasattr(obj,"func"))
print(hasattr(obj,"age"))   #检查一个没有的属性

以上代码执行结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.py
True
True
False

二、getattr(object,name,default) -> 如果存在name属性(方法)则返回name的值(方法地址)否则返回default值。

# 获取成员
print(getattr(obj,"name"))
print(getattr(obj,"func"))

以上代码执行结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.py
Jack
<bound method Foo.func of <__main__.Foo object at 0x0000000000B325F8>>

三、setattr(object,name,default)

def bulk(self):
    print("Foo.bulk")

setattr(obj,"age",18)
print(getattr(obj,"age"))

setattr(obj,"talk",bulk)    #obj.talk = bulk
ret = getattr(obj,"talk")   #ret = obj.talk
ret(obj)    #bulk里面没有self.name,把obj实例传进去,就获得了self.name

以上代码执行结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.py
18
Foo.bulk

四、delattr(object,'name')

# 删除成员
delattr(obj,"name") #删除属性name,原值为'Jack'
print(getattr(obj,"age"))

以上代码执行结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day7/反射2.py
Traceback (most recent call last):
  File "C:/Users/root/PycharmProjects/S14/day7/反射2.py", line 34, in <module>
    print(getattr(obj,"age"))
AttributeError: 'Foo' object has no attribute 'age'

实例:利用反射实现动态的调用模块中的函数

fanshe/
├── core
│   ├── comments.py  #comments模块内部封装了三个函数
│   ├── __init__.py
│   └── __pycache__
│  
│  
├── index.py  #index模块调用comments模块
└── __pycache__

1、comments模块中定义内容

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
def login():
    print("炫酷登录页面")

def logout():
    print("炫酷退出页面")

def home():
    print("炫酷的主页面")

2、index模块中内容

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
from core import comments
def run():
    inp = input("请输入要访问的URL")  #用户输入一个函数名
    if hasattr(comments,inp):  #判断用户输入的成员是否存在
        func = getattr(comments,inp)  #获取成员
        func()
    else:
        print("啊哦!您访问的页面不存在")

run()

运行index.py

Python基础之反射的更多相关文章

  1. Python 基础 三 反射

    Python 基础 三 反射 今天我们先介绍一下反射这个概念,啥是反射?反射就是自己检测自己.在我们Python的面向对象中的反射是啥意思呢?就是通过字符串的形式操作对象相关的属性.python中的一 ...

  2. python基础(14)-反射&类的内置函数

    反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...

  3. python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态

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

  4. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  5. python基础之反射、面向对象进阶

    isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True 1 class F ...

  6. Python开发【第一篇】Python基础之反射

    反射 反射的作用:反射得作用是提高代码可读行. __import__导入模块和import导入模块的区别: __import__导入模块是通过字符串进行导入. import是常用得导入模块方法. 扩展 ...

  7. Python高手之路【十】python基础之反射

    反射说简单点 --> 就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员. 需求:由用户输入一个模块名,用户输入什么模块名,文件中就导入什么模块: 1:文件都在同一目录下的导 ...

  8. python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用

    内容梗概: 1. isinstance, type, issubclass 2. 区分函数和方法 3. 反射(重点) 4. md5加密 1. isinstance, type, issubclass1 ...

  9. python基础之 面向对象之反射

    1.isinstance和issubclass issubclass(Son,Foo) 判断雷与类之间的是否有继承关系,接受两个参数,一个是疑似子类,一个是疑似父类,判断Son是否是Foo的子类 ob ...

随机推荐

  1. PJAX初体验(主要是利用HTML5 新增API pushState和replaceState+AJAX)

    说在前面 什么是PJAX呢? 站在应用角度的就是既实现了页面无刷新的效果,同时也产生了浏览器的前进和后退,而且url也会变化. 也不是什么新鲜技术,主要是AJAX+html5 pushState和re ...

  2. SQL Server 数据缓存

    引言 SQL Server通过一些工具来监控数据,其中之一的方法就是动态管理管理视图(DMV). 常规动态服务器管理对象 dm_db_*:数据库和数据库对象 dm_exec_*:执行用户代码和关联的连 ...

  3. [java] 深入理解内部类: inner-classes

    [java] 深入理解内部类: inner-classes // */ // ]]>   [java] 深入理解内部类: inner-classes Table of Contents 1 简介 ...

  4. WebSocket in ASP.NET Core

    一.WebSocket WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0 ...

  5. C#的Socket实现UDP协议通信

    今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层.与TC ...

  6. 背水一战 Windows 10 (15) - 动画: 缓动动画

    [源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing ...

  7. nodejs 返回html页面--使用 ejs 模板

    nodejs 可以直接在返回中使用html标签,例如下面的格式,返回 hello world 将会使用 h1 字体. app.get('/html',function(req,res){ res.st ...

  8. php基础知识

    PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言[脚本在服务器上执行]. PHP 文件能够包含文本.HTML.CSS 以及 PHP 代码,在服务器上的执行结果以纯文本返回浏览器. php可以 ...

  9. python之消息队列

    引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题.消息服务擅 ...

  10. checkbox & radio 的对齐问题

    不仅不同浏览器不同,不同的字体,不同的文字大小也会表现不一样. 重置 form checkbox & radio 因为不同浏览器解析不一样,有些是默认margin,有些是默认padding,还 ...