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

获取成员: getattr

class Foo:
def __init__(self, name, age):
self.name = name
self.age = age obj = Foo('klvchen', 18)
inp = input('>>>')
v = getattr(obj, inp)
print(v) 运行结果:
>>>name
klvchen
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age def show(self):
return "%s-%s" %(self.name, self.age) obj = Foo('klvchen', 18)
func = getattr(obj, 'show')
print(func)
res = func()
print(res) 运行结果:
<bound method Foo.show of <__main__.Foo object at 0x00000234F6942588>>
klvchen-18

检查是否含有成员: hasattr

class Foo:
def __init__(self, name, age):
self.name = name
self.age = age def show(self):
return "%s-%s" %(self.name, self.age) obj = Foo('klvchen', 18) print(hasattr(obj, 'name1')) 运行结果:
False

设置成员: setattr

class Foo:
def __init__(self, name, age):
self.name = name
self.age = age def show(self):
return "%s-%s" %(self.name, self.age) obj = Foo('klvchen', 18) # print(hasattr(obj, 'name1')) setattr(obj, 'key', 'value')
print(obj.key) 运行结果:
value

删除成员: delattr

class Foo:
def __init__(self, name, age):
self.name = name
self.age = age def show(self):
return "%s-%s" %(self.name, self.age) obj = Foo('klvchen', 18) print(obj.name)
delattr(obj, 'name')
print(obj.name) 运行结果:
klvchen
AttributeError: 'Foo' object has no attribute 'name'

通过字符串的形式操作对象中的成员

class Foo:
stat = '666' def __init__(self, name, age):
self.name = name
self.age = age res = getattr(Foo, 'stat')
print(res) 运行结果:
666
# 创建两个文件,s1.py 和 s2.py
# s2.py 内容如下:
NAME = 'klvchen' def func():
return 'func' # s1.py 内容如下:
import s2 res1 = getattr(s2, 'NAME')
print(res1) res2 = getattr(s2, 'func')
result = res2()
print(result) #运行 s1.py 文件:
klvchen
func

# 创建两个文件,s1.py 和 s2.py
# s2.py 内容如下:
NAME = 'klvchen' def func():
return 'cwe' class Foo:
def __init__(self):
self.name = 666 # s1.py 内容如下:
import s2 res1 = getattr(s2, 'NAME')
print(res1) res2 = getattr(s2, 'func')
result = res2()
print(result) cls = getattr(s2, 'Foo')
print(cls) obj = cls()
print(obj)
print(obj.name) #运行 s1.py 文件,运行结果:
klvchen
cwe
<class 's2.Foo'>
<s2.Foo object at 0x000001CFCDBB2438>
666

# 创建两个文件,s1.py 和 s2.py
# s2.py 内容如下:
def f1():
return '首页' def f2():
return '新闻' def f3():
return '精华' # s1.py 内容如下:
import s2
inp = input('请输入要查看的URL: ')
if hasattr(s2, inp):
func = getattr(s2, inp)
result = func()
print(result)
else:
print('404') #运行 s1.py 文件,运行结果:
请输入要查看的URL: f1
首页

参考 http://www.cnblogs.com/wupeiqi/articles/5017742.html

Python 映射的更多相关文章

  1. python 映射列表 学习

    列表映射是个非常有用的方法,通过对列表的每个元素应用一个函数来转换数据,可以使用一种策略或者方法来遍历计算每个元素. 例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  2. 精通 Oracle+Python,第 1 部分:查询最佳应践

    原文链接:http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python-1391323-zhs.html 在 Py ...

  3. Python os.md

    os 便携式访问操作系统的特定功能.os模块提供了对特定平台模块(如posix, nt, mac)的封装, 函数提供的api在很多平台上都可以相同使用, 所以使用os模块会变得很方便. 但不是所有函数 ...

  4. python操作oracle数据库-查询

    python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...

  5. python中括号知识点

    Python语言中括号分为几个类型,常见的三个圆括号是圆括号().中间圆括号[]和大括号.它的函数也不同,代表不同的Python基本内置数据类型. python括号 python()中的括号:表示tu ...

  6. 第一章:Hello, World!

    感谢作者 –> 原文链接 本文翻译自The Flask Mega-Tutorial Part I: Hello, World! 一趟愉快的学习之旅即将开始,跟随它你将学会用Python和Flas ...

  7. Flask 教程 第一章:Hello, World!

    本文翻译自The Flask Mega-Tutorial Part I: Hello, World! 一趟愉快的学习之旅即将开始,跟随它你将学会用Python和Flask来创建Web应用.上面的视频包 ...

  8. six库 解决python2的项目如何能够完全迁移到python3

    six库 解决python2的项目如何能够完全迁移到python3 SIX是用于python2与python3兼容的库. 它存在的目的是为了拥有无需修改即可在Python 2和Python 3上同时工 ...

  9. 使用six库将Python2的项目完全转移到python3

    SIX是用于python2与python3兼容的库. 它存在的目的是为了拥有无需修改即可在Python 2和Python 3上同时工作的代码.话虽这么说,但是这并不代表在Python 3中引用该库就可 ...

随机推荐

  1. MVC身份验证及权限管理(转载)

    from https://www.cnblogs.com/asks/p/4372783.html MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供 ...

  2. 如何读取R 的sumary()结果

    思路 step 1: sum = summary(model) step 2: sum有好多属性,直接根据属性名称引用($)即可, 如: + > sum$call 返回 model 使用的模型语 ...

  3. cobub razor 安装及使用

    server端安装及配置 apache2 + Mysql5.7 + php7 + redis 参见:http://docs.cobub.com/pages/viewpage.action?pageId ...

  4. WeexSDK之注册Components

    先来看一下注册Components的源码: + (void)_registerDefaultComponents { [self registerComponent:@"container& ...

  5. 调试Release发布版程序的Crash错误(转)

    http://blog.sina.com.cn/s/blog_48f93b530100fsln.html 在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问 ...

  6. oracle中order by造成分页错误

    问题:今天在工作中,在service中调用分页查询列表接口的时候,返回的到页面的数据中总是存在缺失的数据,还有重复的数据. 分析:select * from (select ROWNUM rn,t.* ...

  7. Flask中的模板语言jinja2

    jinja2介绍 jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用. jinja2的优点 jin ...

  8. Spring MVC 后端获取前端提交的json格式字符串并直接转换成control方法对应的参数对象

    场景: 在web应用开发中,spring mvc凭借出现的性能和良好的可扩展性,导致使用日渐增多,成为事实标准,在日常的开发过程中,有一个很常见的场景:即前端通过ajax提交方式,提交参数为一个jso ...

  9. JavaScript 交换数组元素位置的几种方式

    前言 交换数组元素位置是开发项目中经常用到的场景,总结下用过的几种方式. 第三方变量 最基础的方式,创建一个变量作为中转. let temp = array[index1]; array[index1 ...

  10. Liferay7 BPM门户开发之6: Activiti数据库换为mysql

    第一步: 在mysql中创建数据库名字叫 'activiti' 执行D:\activiti-5.21.0\database\create下的脚本 第二步: 打开=> apache-tomcat/ ...