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. windows8.1 安装Redis

    说点什么 现在互联网都在玩高大上的分布式缓存,或是分布式数据库,去面试的时候也会问些相关知识及应用场景,再没玩过就要out了.  Redis官方只提供了Linux的版本下载,windows的需要去gi ...

  2. $\LaTeX$笔记:Section 编号方式(数字、字母、罗马)&计数器计数形式修改

    $\LaTeX$系列根目录: Latex学习笔记-序 IEEE模板中Section的编号是罗马数字,要是改投其他刊物的话可能得用阿拉伯数字,所以可以在导言部分做如下修改(放在导言区宏包调用之后): \ ...

  3. Effective java笔记(八),异常

    57.只针对异常的情况才使用异常 try { int i = 0; while(true) range[i++].climb(); }catch(ArrayIndexOutOfBoundsExcept ...

  4. Xamarin.Android和UWP之MVVM的简单使用(二)

    0x01 前言 前面一篇,Xamarin.Android和UWP之MVVM的简单使用(一),主要讲了MvvmLight的简单使用 这篇主要讲讲MvvmCross的简单使用,例子的话,还是和上篇的一样. ...

  5. WPF实现无边框窗体拖拽右下角▲ 改变窗体大小【framwork4.0】 谢谢大家关注

    效果图:(右下角拖拽改变窗体大小) 第一步:添加xaml代码: <Border Name="ResizeBottomRight" MouseMove="Resize ...

  6. 异步与并行~ReaderWriterLockSlim实现的共享锁和互斥锁

    返回目录 在System.Threading.Tasks命名空间下,使用ReaderWriterLockSlim对象来实现多线程并发时的锁管理,它比lock来说,性能更好,也并合理,我们都知道lock ...

  7. 纪念品分组 2007年NOIP全国联赛普及组

    题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格 ...

  8. 渡轮问题Ship

    题目描述 Palmia河从东往西流过Palmia国,把整个国家分成南北两半.河的两岸各有N个城市,北岸的每一个城市都与南岸的一个城市互为友好城市,而且任意两个北岸城市的友好城市都不相同.每一对友好城市 ...

  9. No.005:Longest Palindromic Substring

    问题: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  10. jquery管理ajax异步-deferred对象

    今天跟大家分享一个jquery中的对象-deferred.其实早在jquery1.5.0版本中就已经引入这个对象了.不过可能在实际开发过程中用到的并不多,所以没有太在意. 这里先不说deferred的 ...