首页 > 编程语言 >Python 中动态调用函数或类的方法

Python 中动态调用函数或类的方法

时间:2024-02-27 11:55:47浏览次数:29  
标签:__ Python redis module RedisClient 调用函数 import 或类 def

使用 importlib

# module.py

class A:

    def foo(self):
        print('this is foo.')

    @staticmethod
    def static_method():
        print('this is static.')


def bar():
    print('bar……')


def baz():
    print('==baz==')

这种方式其实是__import__() 方式的扩展。
Python官方文档推荐程序式地导入模块时应该使用 import_module() 而不是__import__。
这里我们继续使用上面定义好的module.py模块。

# main.py

import importlib

module_name = 'module'

module_obj = importlib.import_module(module_name)
class_of_module_obj = module_obj.A()
class_of_module_obj.foo()
class_of_module_obj.static_method()
module_obj.bar()

文档参见此处:importlib — import 的实现 — Python 3.9.0 文档

importlib 包的目的有两个。
第一个目的是在 Python 源代码中提供 import 语句的实现(并且因此而扩展 import() 函数)。 这提供了一个可移植到任何 Python 解释器的 import 实现。 相比使用 Python 以外的编程语言实现方式,这一实现更加易于理解。
第二个目的是实现 import 的部分被公开在这个包中,使得用户更容易创建他们自己的自定义对象 (通常被称为 importer) 来参与到导入过程中。

应用场景

我们在使用 redis 的时候,有时候需要添加一个代理类,示例如下:

class RedisClient:
    def init_con(self, *args, **kwargs):
        # do init things
        # like connect redis
        pass

然后希望直接通过这个 RedisClient 执行 redis 相关操作, 比如 set, get, hget…

rc = RedisClient()
rc.set(...)
rc.get(...)
...

这样调用的话, 就需要将 pyredis 中的所有函数都在 RedisClient 中写一遍, 那就有点得不偿失了。
这里实际就是希望能够做到动态调用, 将 RedisClient 中的操作, 根据操作名, 直接映射到实际的 pyredis 操作之上。

所以, 我们在 RedisClient 中:

class RedisClient:
    

    def __getattr__(self, func_name):
        def func(*args, **kwargs):
            # 这里的 getattr 实际就相当于redis_con.<func_name>了
            return getattr(self.redis_conn, func_name)(*args, **args)

if __name__ == '__main__':
    redis_client = RedisClient()
    redis_client.init_con(...)
    redis_client.set('key_name', 'key_value')

这样,就实现动态调动 pyredis 的操作的目的了。

参考链接:https://masantu.com/blog/2020-10-15/python-call-method-dynamically/

标签:__,Python,redis,module,RedisClient,调用函数,import,或类,def
From: https://www.cnblogs.com/bitterteaer/p/18036587

相关文章

  • Vue+Vite+Ts+Python后端demo
    一、创建前端工程1.安装node进入官网下载:Node.js(nodejs.org) 选择安装路径后,默认安装;确认是否成功安装: 2.创建vite项目①:npminitvite@latest②:输入项目名、选择Vue、选择Ts;cd到项目文件夹里;安装依赖项:npmi,启动项目:npmrundev③:打开浏览器,进入:http://localhost:5......
  • Python3中的“联动”现象
    技术背景在python中定义一个列表时,我们一定要注意其中的可变对象的原理。虽然python的语法中没有指针,但是实际上定义一个列表变量时,是把变量名指到了一个可变对象上。如果此时我们定义另外一个变量也指到同一个可变对象的话,就会造成一个“联动”的现象。也就是改变其中的一个值时......
  • python3的json数据库-TinyDB效率篇
    安装了这个TinyDB库后,我突然想到一般来说python执行的速度并不算高,那这个库写文件速度如何呢?测试代码如下:fromtinydbimportTinyDBimporttime#创建数据库对象db=TinyDB('db.json')milliseconds1=int(time.time()*1000)db.insert({'type':'apple','count':......
  • Python函数每日一讲 - 简洁快速学会globals()函数
    引言在Python中,globals()函数是一个强大的工具,它允许您访问全局命名空间中的所有变量和函数。本文将深入探讨globals()函数的语法、用法以及实际应用场景,帮助大家更好地理解和使用这个函数。语句概览globals()函数的语法如下:globals()函数实例下面是globals()函数......
  • python3的json数据库-TinyDB
    无意间看到TinyDB这个词汇,就去查了一下,就发现了它的官方网站这里然后就是按照他说的步骤去做。第1步安装  pip3installtinydb 安装成功后,创建一个文件名字叫做 test.py,输入下面的代码:fromtinydbimportTinyDB,Query#创建数据库对象db=TinyDB('db.json')#......
  • 深入解析Python并发编程的多线程和异步编程
    本文分享自华为云社区《Python并发编程探秘:多线程与异步编程的深入解析》,作者:柠檬味拥抱。在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别是在处理I/O密集型任务时。Python提供了threading模块,使得多线程编程变得相对简单。本文将深入探讨thre......
  • 把python脚本制作成exe
    将Python脚本转换为可执行文件(exe)的方法之一是使用PyInstaller。这是一个流行的第三方库,可以将Python脚本打包成独立的可执行文件,在没有安装Python解释器的计算机上运行。以下是详细步骤:1.安装PyInstaller首先,确保你已经安装了Python和pip。然后在命令行或终端中运行以下命令来......
  • Python 机器学习 决策树 数值型特征的处理
    ​ Python机器学习中,特征提取是将原始数据转换为能够被模型有效利用的格式的过程。对于决策树模型而言,特征提取尤其重要,因为好的特征可以显著提升模型的预测性能。在实际应用中,需要根据具体情况选择合适的特征提取方法。数值型特征是机器学习中常见的一种特征类型,它指的是可以......
  • Python numpy.full函数方法的使用
    ​ NumPy(NumericalPython的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍一下NumPy中full方法的使用。参考文档:Pythonnumpy.full函数方法的使用-CJ......
  • 学习python自动化——pytest单元测试框架
    一、什么是pytest单元测试框架,unittest(python自带的),pytest(第三方库)。用于编写测试用例、收集用例、执行用例、生成测试结果文件(html、xml)1.1、安装pytestpipinstallpytest1.2、导入importpytest二、步骤2.1、TestCase(测试用例)2.1.1、创建测试类......