python面向对象基础(二)反射
1.反射
前言
如何动态输入一个模块名,可以随时访问到导入模块中的方法或者变量?
- in= input(“请输入你想导入的模块名:”)
- CC = __import__(in)
- #這种方式就是通过输入字符串导入你所想导入的模块
- CC.f1() # 执行模块中的f1方法
实现了动态输入模块名,从而使我们能够输入模块名并且执行里面的函数。但是执行的函数被固定了。如何实现动态输入函数名来执行呢?
- in = input("请输入模块:")
- mod= __import__(in) # 等价于import in
- in_func = input("请输入要执行的函数:")
- f = getattr(mod,in_func,None)
- #作用:从导入模块中找到你需要调用的函数in_func,然后返回一个该函数的引用.没有找到就返回None
- f() # 执行该函数
what
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!
反射的四大金刚hasattr,getattr,setattr,delattr
- #是否有
def hasattr(*args, **kwargs): # real signature unknown- """
- Return whether the object has an attribute with the given name.
- This is done by calling getattr(obj, name) and catching AttributeError.
- """
- pass
- #得到
- def getattr(object, name, default=None): # known special case of getattr
- """
- getattr(object, name[, default]) -> value
- Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
- When a default argument is given, it is returned when the attribute doesn't
- exist; without it, an exception is raised in that case.
- """
- pass
- #设置
- def setattr(x, y, v): # real signature unknown; restored from __doc__
- """
- Sets the named attribute on the given object to the specified value.
- setattr(x, 'y', v) is equivalent to ``x.y = v''
- """
- pass
- #删除
- def delattr(x, y): # real signature unknown; restored from __doc__
- """
- Deletes the named attribute from the given object.
- delattr(x, 'y') is equivalent to ``del x.y''
- """
- pass
案例:
对对象属性进行反射
- class A:
- f = '类的静态变量'
- def __init__(self,name,age):
- self.name=name
- self.age=age
- def say_hi(self):
- print('hi,%s'%self.name)
- obj=A('斌哥',24)
- #检测是否含有某属性
- print(hasattr(obj,'name'))
- print(hasattr(obj,'say_hi'))
- #获取属性
- n=getattr(obj,'name')
- print(n)
- func=getattr(obj,'say_hi')
- # func2=getattr(obj,'say_hello')#没有该属性报错
- # AttributeError: 'Foo' object has no attribute 'say_hello'
- func3=getattr(obj,'say_hello',None) #返回None
- func4=getattr(obj,'say_hello',"没有该属性") #返回 "没有该属性"
- func()
- #设置属性
- #可以添加新属性,也可以更改旧属性
- setattr(obj,'还能长高',True)
- setattr(obj,'show_name',lambda self:self.name+'18cm')
- print(obj.__dict__)
- #{'还能长高': True, 'name': '斌哥', 'show_name': <function <lambda> at 0x0000024D6E9116A8>, 'age': 24}
- print(obj.show_name(obj)) #斌哥18cm
- # #删除属性
- delattr(obj,'age')
- delattr(obj,'show_name')
- # delattr(obj,'show_name111')#不存在,则报错
- #显示全部属性
- print(obj.__dict__)
- # {'还能长高': True, 'name': '斌哥'}
对类属性 静态成员 类成员的反射
- class A(object):
- staticField = "毕业于南昌大学"
- def __init__(self):
- self.name = '王庆斌'
- def func(self):
- return '返回func方法'
- @staticmethod
- def func2():
- return '返回func2方法'
- @classmethod
- def func3(cls):
- return '返回func3方法'
- print(getattr(A, 'staticField'))
- print(getattr(A, 'func'))
- print(getattr(A, 'func2'))
- print(getattr(A,'func3'))
- setattr(A,'staticField','想毕业于五道口')
- print(A.staticField)
毕业于南昌大学
<function A.func at 0x0000024D6E9AC158>
<function A.func2 at 0x0000024D6E9AC378>
<bound method A.func3 of <class '__main__.A'>>
想毕业于五道口
- #类方法一样的修改
- setattr(A,'func3',lambda:print("学会mongo"))
- A.func3()
- 学会mongo
导入其他模块,利用反射查找该模块是否存在某个方法
- import sys
- def s1():
- print('s1')
- def s2():
- print('s2')
- this_module = sys.modules[__name__]
- hasattr(this_module, 's1') #true
- getattr(this_module, 's2') ==》得到该属性
- # test1.py
- class A:
- def func(self):
- return "func in A in 模块1"
- #test2.py
- import 模块1.test1 as test1
- print(hasattr(test1,"A"))
- a=test1.A()
- print(hasattr(a,'func'))
- a.func()
- Out:
- True
- True
- 'func in A in 模块1'
python面向对象基础(二)反射的更多相关文章
- Python开发基础-Day22反射、面向对象进阶
isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True class Foo ...
- python 面向对象编程 之 反射
1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- python 面向对象基础和高级复习
面向对象基础 面向对象编程 面向过程编程:类似于工厂的流水线 优点:逻辑清晰 缺点:扩展性差 面向对象编程:核心是对象二字,对象属性和方法的集合体,面向对象编程就是一堆对象交互 优点:扩展性强 缺点: ...
- Python 面向对象 基础
编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...
- python面向对象基础
面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...
- Python 面向对象基础知识
面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass ...
- 十六、python面向对象基础篇
面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...
- 1.Python面向对象基础
面向对象(OOP) 面向对象编程--object oriented programming 简写 OOP 面向过程和面向对象的区别: 面向过程: 1.把完成某一个需求的所有步骤从头到尾逐步实现 2 ...
- PYTHON开发--面向对象基础二
一.成员修饰符 共有成员 私有成员, __字段名 - 无法直接访问,只能间接访问 1. 私有成员 1.1 普通方法种的私有成员 class Foo: def __init__(self, n ...
随机推荐
- Excel小技巧(随机点名)
如图,想要做一个随机点名的表格,同样可以石头剪刀布的场合,随机选人. 如何做呢? 第一步,填好想要的数据 第二步,在空的位置输入=INDIRECT("A"&RANDBETW ...
- Oracle数据库弱口令解密
1.首先我们先看下Oracle加密的格式. 接下来我们把他头和尾部删除,中间加: 通过py脚本来进行完成 转换完成后输出成这种格式 之后直接丢进kali里面,用john --w=字典文件 + 转换文件 ...
- poj2299(归并排序求逆序对)
题目链接:https://vjudge.net/problem/POJ-2299 题意:给定一个序列,每次只能交换邻近的两个元素,问要交换多少次才能使序列按升序排列. 思路:本质就是求逆序对.我们用归 ...
- python使用xlutils库save()之后,文件损坏
import xlrd from xlutils.copy import copyworkbook=xlrd.open_workbook('test.xlsx')##打开excel为 .xlsx格式w ...
- linux下安装anconda3
Liunx下安装anconda3其实特变简单,只需这几步骤 1. 首先要到网上下载一个ancoda3的安装包.然后在上传到linux上面即可 3. 是不是特别简单呢?哈哈
- 深入理解Python中的GIL(全局解释器锁)
深入理解Python中的GIL(全局解释器锁) Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东 ...
- Java EE Servlet相关的两个包
Servlet in Java EE 在Java EE的规范API中(链接),Servlet相关联的最重要的两个Package为: 1.javax.servlet 包含了一系列接口和类,他们在一个Se ...
- java lesson20homework
package com.xt.lesson20; /** * 简易自动提款机 1. 创建用户类User(包含卡号.姓名.密码.余额等属性),用户开卡时录入的姓名和密码(自动分配一个卡号.初始金额设置为 ...
- 随便----js参考书
一.Javascript方面的书籍: 1 JavaScript权威指南(第6版):号称javascript圣经,前端必备:前端程序员学习核心JavaScript语言和由Web浏览器定义的JavaScr ...
- centos7配置rsync+inotify数据实时共享
关于centos7版本上面搭建rsync服务并且实现实时同步之前一直是在6版本上面搭建rsync服务,在7版本上面折腾了半天.此处总结下inotify下载地址:http://github.com/do ...