Python reflect单例模式反射各个函数

目录
  • reflect反射
  • 实例分析
  • getattr()函数的使用方法
  • setattr() 函数对应函数 getattr()
  • delattr 函数用于删除属性
  • 单例模式
  • 应用场景

reflect反射

首先,我们要区分两个概念——“标识名”和“字符串”。

两者字面上看起来一样,却是两种东西:

前者是函数func的函数名,后者只是一个叫“func”的字符串,两者是不同的事物。我们可以用func()的方式调用函数func,但我们不能用"func"()的方式调用函数。说白了就是,不能通过字符串来调用名字看起来相同的函数!

那么反射的作用或者意义是什么呢?

实例分析

考虑有这么一个场景:需要根据用户输入url的不同,调用不同的函数,实现不同的操作,也就是一个WEB框架的url路由功能。

首先,有一个commons.py文件,它里面有几个函数,分别用于展示不同的页面。

# commons.py
 pass

其次,有一个visit.py文件,作为程序入口,接收用户输入,并根据输入展示相应的页面

# visit.py
pass

这就实现了一个简单的url路由功能,根据不同的url,执行不同的函数,获得不同的页面。

然而,让我们思考一个问题,

如果commons文件里有成百上千个函数呢(这很常见)?难道在visit模块里写上成百上千个elif?显然这是不可能的!那么怎么办?

仔细观察visit.py中的代码,会发现用户输入的url字符串和相应调用的函数名好像!

如果能用这个字符串直接调用函数就好了!但是,前面已经说了字符串是不能用来调用函数的。为了解决这个问题,Python提供了反射机制,帮助我们实现这一想法!

现在将前面的visit.py修改一下,代码如下:

# visit.py
pass

getattr()函数的使用方法

接收2个参数,前面的是一个类或者模块,后面的是一个字符串,注意了!是个字符串!func = getattr(commons,inp)语句是关键,通过getattr()函数,从commons模块里,查找到和inp字符串“外形”相同的函数名,并将其返回,然后赋值给func变量。变量func此时就指向那个函数,func()就可以调用该函数。

这个过程就相当于把一个字符串变成一个函数名的过程。这是一个动态访问的过程,一切都不写死,全部根据用户输入来变化。

瑕疵:前面的代码还有个小瑕疵,那就是如果用户输入一个非法的url,比如jpg,由于在commons里没有同名的函数,肯定会产生运行错误

那怎么办呢?python提供了一个hasattr()的内置函数,用法和getattr()基本类似,它可以判断commons中是否具有某个成员,返回True或False。

现在将代码修改一下:

# visit.py
pass

这下就没有问题了!通过hasattr()的判断,可以防止非法输入导致的错误,并将其统一定位到错误页面。

setattr() 函数对应函数 getattr()

用于设置对象的属性值,该属性不一定是存在的。

setattr() 语法:

getattr(object, name)

参数:

  • object -- 对象。
  • name -- 字符串,对象属性。
  • return:value -- 属性值。
setattr(object, name, value)

参数:

  • object -- 对象。
  • name -- 字符串,对象属性。
  • value -- 属性值。

使用:设置真实存在的属性值

pass

如果属性不存在会创建一个新的对象属性,并对属性赋值:

pass

delattr 函数用于删除属性

语法:

delattr(object, name)

参数:

  • object -- 对象。
  • name -- 必须是对象的属性。

使用:

pass

单例模式

单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于被外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式的要点有三个;

  • 某个类只能有一个实例;
  • 它必须自行创建这个实例;
  • 它必须自行向整个系统提供这个实例。

应用场景

比如,某个服务器的配置信息存在在一个文件中,客户端通过AppConfig类来读取配置文件的信息.如果程序的运行的过程中,很多地方都会用到配置文件信息,则就需要创建很多的AppConfig实例,这样就导致内存中有很多AppConfig对象的实例,造成资源的浪费.其实这个时候AppConfig我们希望它只有一份,就可以使用单例模式.

到此这篇关于Python reflect单例模式反射各个函数的文章就介绍到这了,更多相关 Python reflect内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 设计模式创建型单例模式

    目录 一.单例模式 二.应用场景 三.编码示例 1.单线程中的单例模式 方式一.重载类构造器 方式二.实现单例装饰器 2.多线程中的单例模式 方式三.重载具有线程锁的类构造器 一.单例模式 单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象. 二.应用场景 整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如: 系统的配置信息对象 日志对象 数据库操作对象 线程池对象 三.编码示例 1.单线程中的单例模式 方式一.重载类构造器 定义: cla

  • Python实现单例模式的5种方法

    目录 基本介绍 优缺点 Python实现 方式1,元类实现: 方式2,继承实现: 方式3,装饰器实现: 方式4,模块实现: 方式5,@classmethod实现单例模式: 基本介绍 一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点. 单例模式应该是应用最广泛,实现最简单的一种创建型模式. 特点:全局唯一,允许更改 优缺点 优点: 避免对资源的多重占用,如写入文件操作 节省内存 防止命名空间被污染 缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而

  • python单例模式的应用场景实例讲解

    1.应用场景 需要频繁创建和销毁的对象: 创建花费太多时间或资源,但经常使用的对象: 工具类对象: 经常访问数据库或文件的对象. 2.实例 如果每个对象中封装了相同的数据,但是需要创建多个对象的时候,而且这两个实例所有的功能是一样的,所以我们就可以使用一个实例完成,在这里我们就可以使用单例模式,如下 class Person: def __init__(self): self.name = '123123' self.age = '20' def f1(self): pass def f2(se

  • python单例模式之selenium driver实现单例

    目录 一.使用装饰器实现单例 二.web自动化driver实现单例模式 2.1编写单例模式的装饰器 2.2driver使用装饰器,实现单例模式 2.3获取driver的实例,就是单例了 三.在自动化项目中具体的应用 3.1项目结构 四.工具层Utils 4.1singleton.py是单例装饰器 4.2GetSeleniumDriver.py driver实现单例 五.页面元素层TsetSharelab 六.流程层 七.case层,把业务逻辑组成一条条用例 一.使用装饰器实现单例 def Sin

  • Python reflect单例模式反射各个函数

    目录 reflect反射 实例分析 getattr()函数的使用方法 setattr() 函数对应函数 getattr() delattr 函数用于删除属性 单例模式 应用场景 reflect反射 首先,我们要区分两个概念——“标识名”和“字符串”. 两者字面上看起来一样,却是两种东西: 前者是函数func的函数名,后者只是一个叫“func”的字符串,两者是不同的事物.我们可以用func()的方式调用函数func,但我们不能用"func"()的方式调用函数.说白了就是,不能通过字符串来

  • 基于Python中单例模式的几种实现方式及优化详解

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息.如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪

  • Python面向对象之反射/自省机制实例分析

    本文实例讲述了Python面向对象之反射/自省机制.分享给大家供大家参考,具体如下: 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) 下面就介绍四种实现自省的函数,适用于类和对象 1. 判断object中有没有一个name字符串对应的属性或者方法 hasattr(object,name) 2. 获取object中name字符串对应的属性值或者方法地址,其中default参数的作用是,在找不到属性的时候,给予调用者的提示信息. getattr(object,name,defaul

  • Python异常处理与反射相关问题总结

    一.异常处理 在程序开发中如果遇到一些 不可预知的错误 或 你懒得做一些判断 时,可以选择用异常处理来做. import requests while True: url = input("请输入要下载网页地址:") res = requests.get(url=url) with open('content.txt', mode='wb') as f: f.write(res.content) 上述下载视频的代码在正常情况下可以运行,但如果遇到网络出问题,那么此时程序就会报错无法正常

  • Python中的反射知识点总结

    通过字符串映射或修改程序运行时的状态.属性.方法, 可以通过下面这4中方法 ''' 使用getattr(object, name_str, default=None) 方法获取object对象里 对应的方法或者属性的内存地址 如果是属性:直接返回属性值 如果是方法:返回方法的内存地址 ''' # hasattr(object,name_str) 判断object对象是否有一个名为name_str的方法或者属性 代码演示: # -*- coding:utf8 -*- class Person(ob

  • Python实现单例模式的五种写法总结

    目录 使用模块 使用装饰器 基于 __new__ 方法实现 基于 metaclass 方式实现 单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息.如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConf

  • Go REFLECT Library反射类型详解

    目录 一.反射概述 二.反射类型对象 基本数类型的 反射类型对象 引用数据类型的 反射类型对象 结构体的 反射类型对象 指针的 反射类型对象 一.反射概述 反射是指程序在运行期间对程序本身进行访问和修改的能力.程序在编译过程中变量会被转换为内存地址,变量名不会被编译器写入到可执行部分.在程序运行时程序无法获取自身的信息. 在静态语言中如 Java 可以在程序编译期将变量的反射信息,如字段名称.类型等信息整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并

  • 简单了解Python中的几种函数

    几个特殊的函数(待补充) python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda >>> g = lambda x,y:x+y #x+y,并返回结果 >>> g(3,4) 7 >>> (lambda x:x**2)(4) #返回4的平方 16 lambda函数的使用方法: 在lambda后面直接跟变量 变量后面是冒号 冒号后面是表达式,表达式计算

  • python正则表达式re之compile函数解析

    re正则表达式模块还包括一些有用的操作正则表达式的函数.下面主要介绍compile函数. 定义: compile(pattern[,flags] ) 根据包含正则表达式的字符串创建模式对象. 通过python的help函数查看compile含义: help(re.compile) compile(pattern, flags=0) Compile a regular expression pattern, returning a pattern object. 通过help可以看到compile

  • Python实现截屏的函数

    本文实例讲述了Python实现截屏的函数.分享给大家供大家参考.具体如下: 1.可指定保存目录. 2.截屏图片名字以时间为文件名 3.截屏图片存为JPG格式图片,比BMP小多的,一个1024*800的截屏BMP有3M多,一个1024*800的JPG只有300K左右. 就可做一个简单的监控了,每10秒截一屏,放到一个指定隐藏的文件夹里,基本掌握机子的使用了,适合监控自家小孩的使用情况 # -*- coding: cp936 -*- import time,Image import os, win3

随机推荐