python学习之:妙用魔法函数 __dict___来调用对象中的方法,或者 python文件中的方法

news2025/1/6 18:03:32

文章目录

  • 场景
    • 原始写法
    • 升级写法
    • 面向对象的写法
  • 总结

场景

原始写法

  • 假设现在有一个文件 tool.py
  • 我想在外部输入一个 字符串 就调用这个字符串对应的函数
  • 如果你不是用 __dict__ 这个好用的函数,那么你大概率会以下面的方式去写 main 函数,给很多 if
  • 但是如果不只是两个函数,而是几十个函数,这么写不是人都要写废了么
"""
 fileName: tool.py
 @Time    : 2022/12/11
 @Author  : Peinuan qin
 """

def sum(a,b):
    return a + b

def sub(a, b):
    return a - b
"""
 fileName: main.py
 @Time    : 2022/12/11
 @Author  : Peinuan qin
 """
from tool import sum, sub


def main(method_name, a, b):
    print()
    if method_name == 'sum':
        return sum(a, b)
    else:
        return sub(a, b)


if __name__ == '__main__':
    a = 1
    b = 2
    print(main('sub', a, b))


升级写法

"""
 fileName: main.py
 @Time    : 2022/12/11
 @Author  : Peinuan qin
 """
import tool
from pprint import pprint

def main(method_name, a, b):
    pprint(tool.__dict__) # 打印一下 __dict__  的返回信息
    
    return tool.__dict__[method_name](a, b)
    

if __name__ == '__main__':
    a = 1
    b = 2
    main("sub", a, b)

在这里插入图片描述

  • 从这里能看出来,调用 tool.__dict__ 返回的内容是一个字典,字典的 keytool.py 这个文件中定义或者内置的所有方法名,value 则是这个方法的对象。是可以直接调用的 !
  • 所以我们通过 tool.__dict__[method_name](a, b) 这样操作,就相当于我把名称输进去,返回给我的是那个函数,然后我在把参数 a,b 输进去,就可以直接得到返回值!是不是很方便很简洁

面向对象的写法

  • 在这里,我把 sumsub 封装到 Calculator 内部,同时为了比较,我们定义了一个成员方法 calculate 来实现上面的 main() 函数的作用。那这样的调用方法稍有不同
  • 因为我们只能通过 类名.__dict__ 才能得到类中定义的方法对象,因此我们必须使用 Calculate.__dict__[method_name] 来得到成员方法,同时,由于我们的 subsum 都是 成员方法 是属于一个具体的 对象 的,因此我们同样应该把 self 作为参数传进去
  • 这种情况下,如果 Calculator 里有 类方法 是没有办法通过 __dict__ 这种方式调用的
"""
 fileName: tool.py
 @Time    : 2022/12/11
 @Author  : Peinuan qin
 """
 
class Calculator:
    def __init__(self):
        pass

    def sum(self, a,b):
        return a + b

    def sub(self, a, b):
        return a - b

    def calculate(self, method_name, a, b):
    	# 只能通过这种方式调用 sum, sub 两个成员方法
        return Calculator.__dict__[method_name](self, a, b)

    @classmethod
    def print_result(cls, a, b):
        print(a, b)

总结

  • __dict__ 这种方法可以针对一个 .py 文件中定义的方法使用,也可以针对 成员方法 使用
  • 对成员方法使用的时候,记得要把 self 关键字补上
  • 对于 类方法静态方法,不能通过 __dict__ 来实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全观察报告 态势总览

执行摘要 从 1987 年 9 月 14 日,中国向世界发出第一封电子邮件 到如今,中国的互联网发展已过去整整 31 个年头。从消费互联、产业互联到万物互联,互联网正在加速改变我们的交流方式和交易方式,一次次 004.重塑了国家的经济形态和…

创建型 - 单例模式(Singleton pattern)

单例模式(Singleton Pattern):确保一个类有且只有一个实例,并提供一个全局访问点。 文章目录懒汉式-线程不安全饿汉式-线程安全懒汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现实现方式总结使用场景JDK懒汉式-线程不安…

论文(world、WPS)插入参考文献引用详细教程

一、参考资料 如何在WPS中添加论文参考文献 【Word】怎样给论文添加引用参考文献 word添加各种引用 二、相关介绍 1. 参考文献的标注 参考文献的标注分为全部引用、局部引用、间接引用。 1.1 全部引用(直接引用) 需要双引号,无论冒号…

[附源码]Python计算机毕业设计SSM基于的社区疫情管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

ADI Blackfin DSP处理器-BF533的开发详解24:触摸屏的实现和应用(含源代码)

硬件准备** ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 使用到硬件模块原理图 功能介绍 四线电阻式触摸屏,拿笔和指甲划拉的,不是现在的容性触摸屏。 ADSP-EDU-BF53x 板卡的 …

《Docker》阿里云服务器docker部署nginx并配置https踩坑记录(完整)

前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 来个关注吧,点个赞…

# Docker说明、安装(Windows10家庭版)

Docker说明、安装(Windows10家庭版) Docker是什么?它是干嘛的? 开始,我就知道别人说是用来加工tar包的。tar包?又是干什么用的? tar包,个人粗俗的理解就是一个环境,里面…

CVPR2021 | VQGAN+:Taming Transformers for High-Resolution Image Synthesis

原文标题:Taming Transformers for High-Resolution Image Synthesis 主页:Taming Transformers for High-Resolution Image Synthesis 代码:https://github.com/CompVis/taming-transformers transformer比CNN缺少了归纳偏置和局部性&…

音视频编解码经典问题汇总(1)

前言: 大家好,今天给大家分享的内容是关于平时在做音频编解码会遇到的一些问题,比如说:解码播放的时候,播不出来解码播放的时候,画面有条纹编码的时候,修改分辨率大小,没有反应这三个…

【NumPy 数组副本 vs 视图、NumPy 数组形状、重塑、迭代】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

实验五 进程通信-管道通信

1. 函数int pipe(int fd[2])创建一个管道,管道两端可分别用描述字fd[0]以及fd[1]来描述。需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写&#xff0c…

我失业了?| ChatGPT生信分析初体验

最近ChatGPT火的一塌糊涂,作为在生物医学和计算机科学领域夹缝求生的边缘摇摆人,也来蹭一波热度。ChatGPT是一个预训练的语言模型,由OpenAI训练。它可以用来生成自然语言文本,并且可以进行对话。它基于Transformer架构&#xff0c…

OAuth2.0的四种授权方式

前言 OAuth 简单理解就是一种授权机制,它是在客户端和资源所有者之间的授权层,用来分离两种不同的角色。在资源所有者同意并向客户端颁发令牌后,客户端携带令牌可以访问资源所有者的资源。 OAuth2.0 是 OAuth 协议的一个版本,有…

【计算机毕业设计】77.旅游资源网站源码

一、系统截图(需要演示视频可以私聊) 摘 要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中&#xf…

MATLB|分布式能源的选址与定容IEEE30节点实现

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

Jmeter(四):请求默认值元件应用,模拟http请求实战,正则表达式提取器元件讲解

Jmeter(7):jmeter请求默认值元件应用 HTTP请求默认值 在公司内部进行测试的时候,一般测试环境访问的接口地址(服务器名称 或IP)、端口、协议一般都是不变的,但http请求取样器每个请求都要求写一遍 这些信息&#xff0…

购物网站系统

视频如下 go网站前台:关于我们、联系我们、公告信息、商品类型、商品信息、商品评论管理员: 1、管理关于我们、联系我们 2、增删改查公告类型、公告信息 3增删改查商品类型、商品信息 4、查看注册用户信息 5、查看用户充值信息 6、查看回复用户咨询 7、查看下单信息 8、发货、查…

微信支付API3 APP【统一下单 APIV3】

官方参考资料 签名:签名生成-接口规则 | 微信支付商户平台文档中心 签名生成:签名生成 - WechatPay-API-v3 统一下单接口:微信支付-开发者文档 如何查看证书序列号:证书相关 - WechatPay-API-v3 私钥和证书:私钥和…

EXCEL基础:数据透视表(按年龄分组统计与统计各部门的工资情况)

【按年龄分组进行统计】: 如下为原始数据,最后就是年龄字段: 选择数据单元格,在新表里插入【数据透视表】,若数据透视表的【字段列表】没有显示,可以按照1标注那里勾选, 按照2处的列、行和统计…

Pytorch:使用官网提供数据集的相关参数设置,以CIFAR10为例进行说明

文章目录前言一、Dataset定义-组成分类二、获取数据集1.参数说明2.相关Demo前言 本文记录笔者关于Dataset的相关学习记录,以Pytorch官网文档为主进行学习 一、Dataset 定义-组成 所谓Dataset,指的是我们在学习神经网络中要接触的数据集,一…