1.反射

前言

如何动态输入一个模块名,可以随时访问到导入模块中的方法或者变量?

  1. in= input(“请输入你想导入的模块名:”)
  2. CC = __import__(in)
  3. #這种方式就是通过输入字符串导入你所想导入的模块
  4. CC.f1() # 执行模块中的f1方法

实现了动态输入模块名,从而使我们能够输入模块名并且执行里面的函数。但是执行的函数被固定了。如何实现动态输入函数名来执行呢?

  1. in = input("请输入模块:")
  2. mod= __import__(in) # 等价于import in
  3.  
  4. in_func = input("请输入要执行的函数:")
  5. f = getattr(mod,in_funcNone)
  6.  
  7. #作用:从导入模块中找到你需要调用的函数in_func,然后返回一个该函数的引用.没有找到就返回None
  8.  
  9. f() # 执行该函数

what

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。

反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

反射的四大金刚hasattr,getattr,setattr,delattr

  1. #是否有
    def hasattr(*args, **kwargs): # real signature unknown
  2. """
  3. Return whether the object has an attribute with the given name.
  4.  
  5. This is done by calling getattr(obj, name) and catching AttributeError.
  6. """
  7. pass
  8.  
  9. #得到
  10. def getattr(object, name, default=None): # known special case of getattr
  11. """
  12. getattr(object, name[, default]) -> value
  13.  
  14. Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
  15. When a default argument is given, it is returned when the attribute doesn't
  16. exist; without it, an exception is raised in that case.
  17. """
  18. pass
  19.  
  20. #设置
  21. def setattr(x, y, v): # real signature unknown; restored from __doc__
  22. """
  23. Sets the named attribute on the given object to the specified value.
  24.  
  25. setattr(x, 'y', v) is equivalent to ``x.y = v''
  26. """
  27. pass
  28.  
  29. #删除
  30. def delattr(x, y): # real signature unknown; restored from __doc__
  31. """
  32. Deletes the named attribute from the given object.
  33.  
  34. delattr(x, 'y') is equivalent to ``del x.y''
  35. """
  36. pass

案例:

对对象属性进行反射

  1. class A:
  2. f = '类的静态变量'
  3. def __init__(self,name,age):
  4. self.name=name
  5. self.age=age
  6.  
  7. def say_hi(self):
  8. print('hi,%s'%self.name)
  9.  
  10. obj=A('斌哥',24)
  11.  
  12. #检测是否含有某属性
  13. print(hasattr(obj,'name'))
  14. print(hasattr(obj,'say_hi'))
  15.  
  16. #获取属性
  17. n=getattr(obj,'name')
  18. print(n)
  19. func=getattr(obj,'say_hi')
  20. # func2=getattr(obj,'say_hello')#没有该属性报错
  21. # AttributeError: 'Foo' object has no attribute 'say_hello'
  22. func3=getattr(obj,'say_hello',None) #返回None
  23. func4=getattr(obj,'say_hello',"没有该属性") #返回 "没有该属性"
  24. func()
  25.  
  26. #设置属性
  27. #可以添加新属性,也可以更改旧属性
  28. setattr(obj,'还能长高',True)
  29. setattr(obj,'show_name',lambda self:self.name+'18cm')
  30. print(obj.__dict__)
  31. #{'还能长高': True, 'name': '斌哥', 'show_name': <function <lambda> at 0x0000024D6E9116A8>, 'age': 24}
  32. print(obj.show_name(obj)) #斌哥18cm
  33.  
  34. # #删除属性
  35. delattr(obj,'age')
  36. delattr(obj,'show_name')
  37. # delattr(obj,'show_name111')#不存在,则报错
  38.  
  39. #显示全部属性
  40. print(obj.__dict__)
  41. # {'还能长高': True, 'name': '斌哥'}

对类属性 静态成员 类成员的反射

  1. class A(object):
  2.  
  3. staticField = "毕业于南昌大学"
  4.  
  5. def __init__(self):
  6. self.name = '王庆斌'
  7.  
  8. def func(self):
  9. return '返回func方法'
  10.  
  11. @staticmethod
  12. def func2():
  13. return '返回func2方法'
  14. @classmethod
  15. def func3(cls):
  16. return '返回func3方法'
  17.  
  18. print(getattr(A, 'staticField'))
  19. print(getattr(A, 'func'))
  20. print(getattr(A, 'func2'))
  21. print(getattr(A,'func3'))
  22.  
  23. setattr(A,'staticField','想毕业于五道口')
  24. print(A.staticField)
  25.  

毕业于南昌大学
<function A.func at 0x0000024D6E9AC158>
<function A.func2 at 0x0000024D6E9AC378>
<bound method A.func3 of <class '__main__.A'>>

想毕业于五道口

  1. #类方法一样的修改
  2. setattr(A,'func3',lambda:print("学会mongo"))
  3. A.func3()
  4.  
  5. 学会mongo

导入其他模块,利用反射查找该模块是否存在某个方法

  1. import sys
  2.  
  3. def s1():
  4. print('s1')
  5.  
  6. def s2():
  7. print('s2')
  8.  
  9. this_module = sys.modules[__name__]
  10.  
  11. hasattr(this_module, 's1') #true
  12. getattr(this_module, 's2') ==》得到该属性

  1. # test1.py
  2. class A:
  3. def func(self):
  4. return "func in A in 模块1"
  1. #test2.py
  2. import 模块1.test1 as test1
  3.  
  4. print(hasattr(test1,"A"))
  5. a=test1.A()
  6. print(hasattr(a,'func'))
  7. a.func()
  8.  
  9. Out:
  10. True
  11. True
  12. 'func in A in 模块1'

python面向对象基础(二)反射的更多相关文章

  1. Python开发基础-Day22反射、面向对象进阶

    isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True class Foo ...

  2. python 面向对象编程 之 反射

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

  3. python 面向对象基础和高级复习

    面向对象基础 面向对象编程 面向过程编程:类似于工厂的流水线 优点:逻辑清晰 缺点:扩展性差 面向对象编程:核心是对象二字,对象属性和方法的集合体,面向对象编程就是一堆对象交互 优点:扩展性强 缺点: ...

  4. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  5. python面向对象基础

    面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...

  6. Python 面向对象基础知识

    面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass ...

  7. 十六、python面向对象基础篇

    面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...

  8. 1.Python面向对象基础

    面向对象(OOP) 面向对象编程--object oriented programming 简写 OOP   面向过程和面向对象的区别: 面向过程: 1.把完成某一个需求的所有步骤从头到尾逐步实现 2 ...

  9. PYTHON开发--面向对象基础二

    一.成员修饰符 共有成员 私有成员, __字段名 - 无法直接访问,只能间接访问 1.     私有成员 1.1  普通方法种的私有成员 class Foo: def __init__(self, n ...

随机推荐

  1. Excel小技巧(随机点名)

    如图,想要做一个随机点名的表格,同样可以石头剪刀布的场合,随机选人. 如何做呢? 第一步,填好想要的数据 第二步,在空的位置输入=INDIRECT("A"&RANDBETW ...

  2. Oracle数据库弱口令解密

    1.首先我们先看下Oracle加密的格式. 接下来我们把他头和尾部删除,中间加: 通过py脚本来进行完成 转换完成后输出成这种格式 之后直接丢进kali里面,用john --w=字典文件 + 转换文件 ...

  3. poj2299(归并排序求逆序对)

    题目链接:https://vjudge.net/problem/POJ-2299 题意:给定一个序列,每次只能交换邻近的两个元素,问要交换多少次才能使序列按升序排列. 思路:本质就是求逆序对.我们用归 ...

  4. python使用xlutils库save()之后,文件损坏

    import xlrd from xlutils.copy import copyworkbook=xlrd.open_workbook('test.xlsx')##打开excel为 .xlsx格式w ...

  5. linux下安装anconda3

    Liunx下安装anconda3其实特变简单,只需这几步骤 1.  首先要到网上下载一个ancoda3的安装包.然后在上传到linux上面即可 3. 是不是特别简单呢?哈哈

  6. 深入理解Python中的GIL(全局解释器锁)

    深入理解Python中的GIL(全局解释器锁) Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东 ...

  7. Java EE Servlet相关的两个包

    Servlet in Java EE 在Java EE的规范API中(链接),Servlet相关联的最重要的两个Package为: 1.javax.servlet 包含了一系列接口和类,他们在一个Se ...

  8. java lesson20homework

    package com.xt.lesson20; /** * 简易自动提款机 1. 创建用户类User(包含卡号.姓名.密码.余额等属性),用户开卡时录入的姓名和密码(自动分配一个卡号.初始金额设置为 ...

  9. 随便----js参考书

    一.Javascript方面的书籍: 1 JavaScript权威指南(第6版):号称javascript圣经,前端必备:前端程序员学习核心JavaScript语言和由Web浏览器定义的JavaScr ...

  10. centos7配置rsync+inotify数据实时共享

    关于centos7版本上面搭建rsync服务并且实现实时同步之前一直是在6版本上面搭建rsync服务,在7版本上面折腾了半天.此处总结下inotify下载地址:http://github.com/do ...