Python 入门 之 反射

1、反射 : (自省)

​ 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。

Python面向对象中的反射:通过字符串的形式操作对象的相关属性。Python中的一切事物都是对象(都可以使用反射)

<1> getattr() 获取
<2> setattr() 设置
<3> hasattr() 判断是否存在
<4> delattr() 删除

(1)通过字符串操作对象的属性和方法

class A:
def __init__(self,name):
self.name = name def func(self):
print("is A func")
a = A("rimo") A.func()
print(a.name)
a.func()

(2)对象的角度使用反射

class A:
def __init__(self,name):
self.name = name def func(self):
print("is A func")
a = A("rimo") print(hasattr(a,"name")) # 返回 True就是说明name这个属性在对象a中存在 print(getattr(a,"name"))
f = getattr(a,"func")
f()
setattr(a,"age",18)
print(a.__dict__) delattr(a,"name")
print(a.__dict__)

(3)类的角度使用反射

class A:
def __init__(self,name):
self.name = name def func(self):
print("is A func") a = A("rimo") print(hasattr(A,"name"))
f = getattr(A,"func")
f(11)

(4)当前模块使用反射

def func():
print("is func") # 当前模块:
print(globals()["func"]) import sys
o = sys.modules[__name__] # 获取当前模块名对应的对象
f = getattr(o,"func")
f()

(5)其他模块使用反射

import test       # 导入模块
test.func() o = globals()["test"]
getattr(o,"func")()

(6)反射的应用场景

class Blog:

    def login(self):
print("is login") def register(self):
print("is register") def comment(self):
print("is comment") def log(self):
print("is log") def log_out(self):
print("is log_out") b = Blog() func_dic = {
"1":b.login,
"2":b.register,
"3":b.comment,
"4":b.log,
"5":b.log_out
} msg = """
1.登录
2.注册
3.评论
4.日志
5.注销
""" choose = input(msg)
if choose in func_dic:
func_dic[choose]()
将上述代码进行修改,减少代码(通过字符串操作对象的属性和方法)
class Blog:
def login(self):
print("is login") def register(self):
print("is register") def comment(self):
print("is comment") def log(self):
print("is log") def log_out(self):
print("is log_out") b = Blog() msg = """
login
register
comment
log
log_out
""" while 1:
choose = input(msg)
if hasattr(b,choose):
getattr(b,choose)()
else:
print("请重新输入!")

Python 入门 之 反射的更多相关文章

  1. python中的反射

    在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...

  2. Python基础之反射

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

  3. python入门简介

    Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...

  4. python入门学习课程推荐

    最近在学习自动化,学习过程中,越来越发现coding能力的重要性,不会coding,基本不能开展自动化测试(自动化工具只是辅助). 故:痛定思痛,先花2个星期将python基础知识学习后,再进入自动化 ...

  5. Python运算符,python入门到精通[五]

    运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是“+”.在计算器语言中运算符大致可以分为5种类型:算术运算符.连接运算符.关系运算符.赋值运 ...

  6. Python基本语法[二],python入门到精通[四]

    在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...

  7. Python基本语法,python入门到精通[二]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]我们已经在自己的windows电脑上搭建好了python的开发环境,这篇博客呢我就开始学习一下Python的基本语法.现 ...

  8. visual studio 2015 搭建python开发环境,python入门到精通[三]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...

  9. python入门教程链接

    python安装 选择 2.7及以上版本 linux: 一般都自带 windows: https://www.python.org/downloads/windows/ mac os: https:/ ...

随机推荐

  1. BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4221 题解 orz WYC 爆切神仙DP 首先将所有袋鼠按大小排序.考虑从前往后DP, ...

  2. ASIHTTPRequest使用

    http://qk13warcraft.blog.163.com/blog/static/157549344201271633014969/ 1.创建和运行请求 创建一个同步请求 这是最简单的用法,发 ...

  3. legend3---lavarel安装debugbar工具条

    legend3---lavarel安装debugbar工具条 一.总结 一句话总结: ` lavarel插件一般是composer官网下载,然后config/app.php中声明和加别名 ` 直接照官 ...

  4. list元素按照日期排序

    private static void ListSort(List<AppClassInfoVo> list) { Collections.sort(list, new Comparato ...

  5. Centos7 Devstack [Rocky] 重启后无法联网

    部署devstack-rocky版本后网络,可以 Ping 通自己的 IP,但 Ping 不同网关,ping不通同网段主机,查看网卡和ovs信息如下 解决 第一步 按造网上教程,修改br-ex,ens ...

  6. JavaScript中的普通函数和构造函数

    在写JavaScript代码过程中,用到需要写构造函数的地方不多,但还是需要详细了解一下 本文尽量描述清楚什么是JavaScript中的构造函数,以及普通函数和构造函数的区别

  7. 利用Calendar类判断是平年还是闰年

    package com.bgs.Math; import java.util.Calendar; import java.util.Scanner; /*###14.21_常见对象(如何获取任意年份是 ...

  8. JS方法调用jQuery内部方法

    转载于:https://blog.csdn.net/tsoTeo/article/details/77848932 已经测试过,可以正常调用!!以下为原文: JS方法能不能调用JQuery里面的方法  ...

  9. 六十三:CSRF攻击与防御之系统准备之登录与转账功能

    登录功能 在forms里面添加验证 class LoginForm(Form): email = StringField(validators=[Email(message='邮箱格式错误')]) p ...

  10. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...