Python基础之反射
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基础之反射的更多相关文章
- Python 基础 三 反射
Python 基础 三 反射 今天我们先介绍一下反射这个概念,啥是反射?反射就是自己检测自己.在我们Python的面向对象中的反射是啥意思呢?就是通过字符串的形式操作对象相关的属性.python中的一 ...
- python基础(14)-反射&类的内置函数
反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...
- python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态
一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
- python基础之反射内置方法元类
补充内置函数 isinstance(obj,Foo) # 判断obj是不是foo的实例 issubclass() # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...
- python基础之反射、面向对象进阶
isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True 1 class F ...
- Python开发【第一篇】Python基础之反射
反射 反射的作用:反射得作用是提高代码可读行. __import__导入模块和import导入模块的区别: __import__导入模块是通过字符串进行导入. import是常用得导入模块方法. 扩展 ...
- Python高手之路【十】python基础之反射
反射说简单点 --> 就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员. 需求:由用户输入一个模块名,用户输入什么模块名,文件中就导入什么模块: 1:文件都在同一目录下的导 ...
- python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用
内容梗概: 1. isinstance, type, issubclass 2. 区分函数和方法 3. 反射(重点) 4. md5加密 1. isinstance, type, issubclass1 ...
- python基础之 面向对象之反射
1.isinstance和issubclass issubclass(Son,Foo) 判断雷与类之间的是否有继承关系,接受两个参数,一个是疑似子类,一个是疑似父类,判断Son是否是Foo的子类 ob ...
随机推荐
- Date, TimeZone, MongoDB, java中date的时区问题
打印new Date(),Fri Aug 12 13:37:51 CST 2016. 显示Asia/Shanghai的时区,但是date toString 的时区简写却是CST.更坑爹的是,Googl ...
- [译] MongoDB Java异步驱动快速指南
导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...
- JAVA常见面试题之Forward和Redirect的区别
用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的.根据转发方式的不同,可以区分为直接请求转发 ...
- 7.2 数据注解属性--TimeStamp特性【Code-First 系列】
TimeStamp特性可以应用到领域类中,只有一个字节数组的属性上面,这个特性,给列设定的是tiemStamp类型.在并发的检查中,Code-First会自动使用这个TimeStamp类型的字段. 下 ...
- ASP.NET MVC HtmlHelper之Html.ActionLink
前言 ActionLink用于生成超链接,方法用于指向Controller的Action. 扩展方法与参数说明 ActionLink扩展方法如下: public static MvcHtmlStrin ...
- Oracle 英文 非标准格式 日期 格式化
最近在处理一张表的时候,需要按照日期排序,日期字段中日期的格式有两种. 格式一:07-Aug-2015 格式二:10/28/16 日期转化及格式化sql语句: select to_date('07-A ...
- PHP+MYSQL网站SQL Injection攻防
程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报 ...
- 【JAVA并发编程实战】8、锁顺序死锁
package cn.study.concurrency.ch10; public class Account { private String staffAccount; //账号 private ...
- php 实现设计模式之 建造者模式
<?php /** * 建造者模式 * ------------- * 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. * 类型:创建类模式 * 四个要素: * ...
- Code First :使用Entity. Framework编程(7) ----转发 收藏
第7章 高级概念 The Code First modeling functionality that you have seen so far should be enough to get you ...