一、反射的基本概念

反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python中一切皆对象,都可以使用反射。

反射有四种方法:

hasattr(obj, str) #判断一个对象是否有str属性或者string方法,有就返回True,没有就返回False

getattr(obj, str) #获取对象的属性或者方法,如果存在则打印出来,getattr和hasattr配套使用
#注意:如果返回的是对象的方法,那么返回的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对() setattr(obj, str, value) #把obj中的str成员设置成value,注意,这里的value可以是值,也可以是函数或者方法 delattr(obj,str) #把obj中的str成员删除掉

注意:以上操作都是在内存中进行的,并不会影响你的源代码

二、反射示例

示例1:

class Foo:
def __init__(self):
self.name = 'egon'
self.age = 51
def func(self):
print("hello") egg = Foo()
setattr(egg, 'gender', 'male')
print(egg.gender)
print(egg.__dict__) def show_name(self):
print(self.name + 'sb')
setattr(egg, 'show_name', show_name)
egg.show_name(egg)
show_name(egg) delattr(egg, 'name')
print(egg.__dict__) # 打印结果:
male
{'name': 'egon', 'age': 51, 'gender': 'male'}
egonsb
egonsb
{'age': 51, 'gender': 'male', 'show_name': <function show_name at 0x101fabe18>}

示例2:

# 反射示例2
class Foo:
pass f = Foo() print(hasattr(f, 'chi')) # False setattr(f, 'chi', '123')
print(f.chi) # 123
print(f.__dict__) # {'chi': '123'} setattr(f, 'chi', lambda x: x + 1)
print(f.chi(3)) # 4
print(f.chi) # 注意:此时的chi既不是静态方法也不是实例方法,更不是类方法,就相当于你在类中写了个 self.chi = lambda 是一样的
print(f.__dict__) # {'chi': <function <lambda> at 0x101eabe18>} delattr(f, 'chi')
print(hasattr(f, 'chi')) # False # 打印结果:
False
123
{'chi': '123'}
4
<function <lambda> at 0x101eabe18>
{'chi': <function <lambda> at 0x101eabe18>}
False

三、反射的应用

1.对象应用反射

 class Foo:
2 def __init__(self):
3 self.name = 'egon'
4 self.age = 51
5 def func(self):
6 print('hello')
7 egg = Foo()
8 print(hasattr(egg,'name')) #先判断name在egg里面存在不存在
9 print(getattr(egg,'name')) #如果为True它才去得到
10 print(hasattr(egg,'func'))
11 print(getattr(egg,'func')) #得到的是地址
12 # getattr(egg,'func')() #在这里加括号才能得到,因为func是方法
13 if hasattr(egg,'func'):
14 getattr(egg,'func')()
15 else:
16 print('没找到')

2.类应用反射

 1 class Foo:
2 f = 123
3 @classmethod
4 def class_method_dome(cls):
5 print('class_method_dome')
6
7 @staticmethod
8 def static_method_dome():
9 print('static_method_dome')
10 print(hasattr(Foo,'class_method_dome'))
11 method = getattr(Foo,'class_method_dome')
12 method()
13 print('------------')
14 print(hasattr(Foo,'static_method_dome'))
15 method1 = getattr(Foo,'static_method_dome')
16 method1()

3.模块应用反射

模块的应用又分为导入其他模块反射和在本模块中反射

  • 到入其他模块反射
 # 1.导入其他模块引用
2 import mymodule
3 print(hasattr(mymodule,'test'))
4 getattr(mymodule,'test')()
5
6 # # 这里的getattr(mymodule,'test')()这一句相当于
7 # p = getattr(mymodule,'test')
8 # p()
  • 在本模块中应用反射
1 # 2.在本模块中应用反射
2 def demo1():
3 print('wwww')
4 import sys
5 # print(sys.modules)
6 module_obj = sys.modules[__name__] #相当于'__main__'
7 print(module_obj)
8 print(hasattr(module_obj,'demo1'))
9 getattr(module_obj,'demo1')()

导入自己的模块的一个简单小例子:

 1 # 举例
2 def 注册():
3 print('regiester')
4 def 登录():
5 print('login')
6 def 购物():
7 pass
8 print('注册,登录,购物')
9 ret = input('请输入你要做的操作:')
10 import sys
11 my_module = sys.modules[__name__] #利用sys模块导入一个自己的模块
12 if hasattr(my_module,ret):
13 getattr(my_module,ret)()

4.其他

db.mysql

class MySQlHelper(object):
print('MySQlHelper1111111')
def fetchone(self):
print('你好')

db.pool

class PoolHelper(object):
print('PoolHelper')

settings.py

DB_PATH = 'db.mysql.MySQlHelper'

#吧字符串切割
module_name,cls_name = DB_PATH.rsplit('.',maxsplit=1)
# print(module_name,cls_name) #db.mysql MySQlHelper
#导入模块
# from db.mysql import MySQlHelper
import importlib
moudel_obj = importlib.import_module(module_name)
print(moudel_obj,type(moudel_obj))
#导入模块中的类
cls = getattr(moudel_obj,cls_name)
print(cls)
#对类进行实例化
obj = cls()
obj.fetchone()
# getattr()

Python面向对象之反射的更多相关文章

  1. Python 面向对象之反射

    Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...

  2. Python面向对象之-反射

    Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr  判断是否有改属性或者方法,有返回True,没有返回false getattr  如果是属性获得该属性 ...

  3. python 面向对象之反射及内置方法

    面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...

  4. python面向对象的反射

    python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) getattr # 根据字符串的形式,去对象中找成员.hasattr # 根据字符 ...

  5. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  6. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  7. 第三十四篇 Python面向对象之 反射(自省)

    什么是反射? 反射的概念是由Smith在1982年提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语 ...

  8. Python 面向对象 (补充) , 反射 , 内置函数

    面向对象中内置函数 issubclass方法: 检查第一个参数是否是第二个参数的子子孙孙类     返回  :   是一个布尔值 class Base(object): pass class Foo( ...

  9. python面向对象之反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

随机推荐

  1. RESTful学习及应用

    原文转自前端路上,转载请注明出处:http://refined-x.com/2017/09/22/RESTful学习及应用/ RESTful是什么 RESTful是一种API架构,符合REST设计原则 ...

  2. June 28th. 2018, Week 26th. Thursday

    You cannot change the circumstances but you can change yourself. 既然改变不了环境,那就改变自己. From Jim Rohn. Rec ...

  3. As-If-Serial 理解

    as-if-serial语义的意思指: 不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变.编译器,runtime 和处理器都必须遵守as-if-serial语义.为了 ...

  4. 编译装php7.2 && nginx-1.14

    环境准备 # cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) # uname -r 3.10.0-957.el7.x86_64 ...

  5. Angular CLI 升级 6.0 之后遇到的问题

    Angular CLI 1.7.4 在使用 ng build --prod 会构建失败,而 ng build 是正常的.比较好的解决办法是使用 ng build --prod --extract-li ...

  6. java+testng接口测试入门

    testNG是一个测试框架,它能组织测试用例按照你想要的方式进行运行,并输出一定格式的便于阅读的测试报告(结果),通过java+testng的方式说明一下接口测试的基本使用方法. 一.环境搭建 a)千 ...

  7. HTML之表单

    目录 表单的结构 get方式与post方式 输入 单行文本输入框 提交按钮和重置按钮 密码输入框 复选框 单选按钮 图像按钮 文本选择输入框 隐藏框 多行文本输入框 下拉列表框 新增输入元素 新增其他 ...

  8. c++ 套路多

    1. 浅拷贝带来的多次析构问题 参见:https://www.cnblogs.com/33debug/p/6657730.html 解决方案,深拷贝.强烈建议自定义拷贝构造函数为深拷贝,否则可能会给自 ...

  9. JS继承以及继承的几种实现方式总结

    传统面向对象语言:继承是类与类之间的关系. 而在js中由于es6之前没有类的概念,所以继承是对象与对象之间的关系. 在js中,继承就是指使一个对象有权去访问另一个对象的能力. 比如:比如对象a能够访问 ...

  10. canvas学习笔记,实用知识点总结(上)

    本博客是本人日常学习笔记,作为重要知识点的总结记录,随笔风格可能更倾向于个人的学习习惯和方式,若对您有帮助十分荣幸,若存在问题欢迎互相学习探讨,前端小白一枚在此恭候. 一.基本使用规则 1.创建画布 ...