python getattr_Python 内置方法和属性应用:反射和单例

da218b39636ed84554f6382113b1d283.png

1. 前言

python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享。

2. 内置方法和函数介绍

  • enumerate
    如果你需要遍历可迭代的对象,有需要获取它的序号,可以用enumerate, 每一个next返回的是一个tuple
    list1 = [1, 2, 3, 4]
    list2 = [4, 3, 2, 1]
    for idx, value in enumerate(list1):
    print(idx, value, list2[idx])# 0 1 4# 1 2 3# 2 3 2# 3 4 1
  • zip zip从参数中的多个迭代器取元素组合成一个新的迭代器;# 给list加上序号
    b = [4, 3, 2, 1]
    for i in zip(range(len(b)), b):
    print(i)# (0, 4)# (1, 3)# (2, 2)# (3, 1)
  • globals():一个描述当前执行过程中全局符号表的字典,可以看出你执行的所有过程
  • id(object):python对象的唯一标识
  • staticmethod 类静态函数注解
    @staticmethod
    def test():
    print('this is static method')
    Foo.test = test
    Foo.test()
  • 类的属性 我们来看下一个类的申明,如下:
    class Foo():
    """this is test class"""
    def __init__(self, name):
    self.name = name
    def run(self):
    print('running')# 列出类的所有成员和属性
    dir(Foo)
    ['__class__',
    '__delattr__',
    '__dict__',
    '__dir__',
    '__doc__',
    '__eq__',
    '__format__',
    '__ge__',
    '__getattribute__',
    '__gt__',
    '__hash__',
    '__init__',
    '__init_subclass__',
    '__le__',
    '__lt__',
    '__module__',
    '__ne__',
    '__new__',
    '__reduce__',
    '__reduce_ex__',
    '__repr__',
    '__setattr__',
    '__sizeof__',
    '__str__',
    '__subclasshook__',
    '__weakref__',
    'run']# 类的注释
    Foo.__doc__# 'this is test class'# 类自定义属性
    Foo.__dict__
    mappingproxy({'__module__': '__main__',
    '__doc__': 'this is test class',
    '__init__': <function __main__.Foo.__init__(self, name)>,
    'run': <function __main__.Foo.run(self)>,
    '__dict__': <attribute '__dict__' of 'Foo' objects>,
    '__weakref__': <attribute '__weakref__' of 'Foo' objects>})# 类的父类
    Foo.__base__# 类的名字
    Foo.__name__类的实例化和初始化# python类先通过__new__实例化,再调用__init__进行初始化类成员
    foo = Foo('milk')类的属性添加和访问# 类的访问
    foo.name
    foo.run()# 可以通过setattr 动态的添加属性
    def method():
    print("cow")
    setattr(foo, "type", "cow")
    setattr(foo, "getcow", method)# cow
    foo.type
    foo.getcow()# 动态删除属性 delattr
    delattr(foo, "type")# getattr 获取成员属性
    if hasattr(foo, "run"): # 判断是否有属性
    func = getattr(foo, "run")
    func()

3. 单例模式应用

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。单例模式要求在类的使用过程中只实例化一次,所有对象都共享一个实例。创建的方法是在实例的时候判断下是否已经实例过了,有则返回实例化过的全局实例。python是如何实现的呢?关键是找到实例化的地方,对就是前面说的__new__

class Singleton(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, '_instance'):cls._instance = object.__new__(cls)return cls._instancedef __init__(self, name):self.name = namea = Singleton('name1')
b = Singleton('name2')
print(id(a), id(b))
print(a.name, b.name)
# 1689352213112 1689352213112
# name2 name2

4. 反射应用

反射在许多框架中都有使用到,简单就是通过类的名称(字符串)来实例化类。一个典型的场景就是通过配置的方式来动态控制类的执行,比如定时任务的执行,通过维护每个定时任务类的执行时间,在执行时间到的时候,通过反射方式实例化类,执行任务,在java中也非常的常见。

python的实现可以通过上面说的getattr获取模块中的类, 通过methodcaller来调用方法。我们来看一个简单的例子

import importlib
from operator import methodcallerclass Foo():"""this is test class"""def __init__(self, name):self.name = namedef run(self, info):print('running %s' % info)# 类所在的模块,默认情况__main__, 可以通过Foo.__dict__ 中'__module__'获取
api_module = importlib.import_module('__main__') 
# getattr获取模块中的类, 这里Foo是字符串哦
clazz = getattr(api_module, 'Foo')# 实例化
params = ["milk"]
instance = clazz(*params)# 方法调用, 方法也是字符串methodcaller(方法名, 方法参数)
task_result = methodcaller("run", "reflection")(instance)# running reflection

5. 总结

本文通过分享了python内置方法和属性, 并在单例模式和反射中进行应用。希望对你有帮助,欢迎交流@mintel 要点总结如下:

  • dir下类
  • 查看类自定义属性__dict__
  • __new__实例化类,__init__初始化类
  • getattr 获取属性
  • setattr 设置属性
  • 记住importlib和methodcaller

小编在此分享一些python干货,需要资料的私信小编“资料”即可免费领取哈

727ba1178ff7e9bf522167722c9359b8.png

10fd9ebcc89aa7be28bb6c20b957dc1e.png

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

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

相关文章

Unity URP世界空间后处理扫描圈效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现&#xff08;LinearDepth&#xff0c;Reverse Z&#xff0c;世界坐标重建&#xff0c;软粒子&#xff0c;高度雾&#xff0c;运动模糊&#xff0c;扫描线效果&#xff09;_puppet_master的专栏-CSDN博客_shader深度…

前端 重构时需要注意的事项_前端数据层落地实践

源宝导读&#xff1a;天际移动平台经过重构改版&#xff0c;近期正式发布了1.0版本&#xff0c;我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面&#xff0c;给大家分享一下统一数据层方案的设计思…

postconstruct_@PostConstruct注解,你该好好看看

在最近的工作中&#xff0c;get到一个很实用的注解&#xff0c;分享给诸位。痛点做过微信或支付宝支付的童鞋&#xff0c;可能遇到过这种问题&#xff0c;就是填写支付结果回调&#xff0c;就是在支付成功之后&#xff0c;支付宝要根据我们给的地址给我们进行通知&#xff0c;通…

Unity URP运动模糊效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现&#xff08;LinearDepth&#xff0c;Reverse Z&#xff0c;世界坐标重建&#xff0c;软粒子&#xff0c;高度雾&#xff0c;运动模糊&#xff0c;扫描线效果&#xff09;_puppet_master的专栏-CSDN博客_shader深度…

线性系统的频率响应分析实验报告_动态系统的建模与分析

参考&#xff1a;DR_CAN1.介绍解决一个控制系统的问题&#xff1a;对研究对象进行分析控制器设计测试分析被控对象的物理特性及动态表现&#xff0c;在这个基础上建立数学模型&#xff0c;数学模型可以是动力学模型、热力学模型、流体力学模型和经济学模型等&#xff0c;然后在…

android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)

在上篇文章&#xff1a;warmcheng&#xff1a;Android生命周期组件 Lifecycle 使用详解​zhuanlan.zhihu.com中&#xff0c;我们讲了 Lifecycle 的简单使用&#xff0c;本篇我们来研究下它的源码。 基础环境搭建首先&#xff0c;按照上篇文章所讲&#xff0c;快速搭建环境。添加…

Leetcode1143. 最长公共子序列(c#)

题解&#xff1a;力扣 public class Solution{public int LongestCommonSubsequence(string text1, string text2){int num1 text1.Length;int num2 text2.Length;int[,] dp new int[num1 1, num2 1];for(int i 0; i < num1; i){for(int j 0; j < num2; j){if(t…

telnet到设备里 php_PHP自动生成设备周检修计划

背景维修人员根据设备年度检修计划&#xff0c;然后制订周检修计划(设备年度计划包含设备一年需要维护几次等信息&#xff0c;根据年度计划分解到某一个周去执行)。在这个过程中&#xff0c;大量的excel复制粘贴工作&#xff0c;浪费人力并且容易出错。并且在审核过程中&#x…

通俗讲解:图像傅里叶变换

转自某乎&#xff1a;通俗讲解&#xff1a;图像傅里叶变换 - 知乎 这里我们主要要讲的是二维图像傅里叶变换&#xff0c;但是我们首先来看一张很厉害的一维傅里叶变换动图。 妈耶~厉害哇&#xff01;它把时域和频域解释的很清楚&#xff01; 什么&#xff01;你看不懂&#x…

数据库断线重连_干货分享—Niushop数据库配置

前几期阿牛ger主讲了代码编码规范&#xff0c;整洁规范的代码有利于我们查询和再次开发&#xff0c;也方便我们检测与修复bug&#xff01;这期&#xff0c;阿牛ger主要与大家分享数据库编码配置&#xff1a;数据库配置Niushop数据库配置方式与thinkphp相同&#xff0c;文件路径…

怎么将matlab滤波器系数导出_matlab与FPGA数字信号处理系列(1)——通过matlab工具箱设计FIR数字滤波器...

以99阶FIR低通滤波器为例&#xff0c;学习使用matlab的fdatool工具箱设计滤波器&#xff0c;并将滤波器系数导出到.coe文件&#xff0c;联合Vivado进行FPGA的FIR滤波器设计。本文滤波器参数为&#xff1a;低通FIR滤波器&#xff0c;窗函数设计&#xff0c;采用布莱克曼窗&#…

UGUI 合批原理

转自&#xff1a; UGUI合批原理笔记 - 赵青青 - 博客园 UGUI合批规则图解_时光不染-CSDN博客_ugui合批规则 合批的过程# 网格更新机制# Cavans.SendWillRenderCanvas m_LayoutRebuildQueuem_GraphicRebuildQueueCanvas.BuildBatch 更新所有DrawCall WaitingForJob 子线程网格…

vb.net 设置打印纸张与页边距_装订文档时不想让文字被挡住?在Excel中你可以这样设置打印!...

平时我们在打印文档的时候&#xff0c;通常会把文档左侧的页边距设置的大一点&#xff0c;这样在装订的时候显得美观一点。但如果我们进行双面打印时&#xff0c;文档左右两边的页边距刚好相反&#xff0c;装订时第2页的文本很容易被挡住&#xff0c;这样子反而更难装订了。那么…

CPU Cache原理与示例

转自这篇 CPU Cache&#xff0c;估计也没人看 基础知识 首先&#xff0c;我们都知道现在的 CPU 多核技术&#xff0c;都会有几级缓存&#xff0c;老的 CPU 会有两级内存&#xff08;L1 和 L2&#xff09;&#xff0c;新的CPU会有三级内存&#xff08;L1&#xff0c;L2&#x…

python集合的基本操作不包括_Python基础知识储备,List集合基本操作大盘点

List列表是Python中最基本的数据结构&#xff0c;也是Python中使用频率最高的数据类型&#xff0c;List列表中的元素不需要具有相同类型&#xff0c;使用起来非常方便。现在就来体验一下List列表的基本操作。 list集合基本操作 List的基本操作&#xff08;&#xff0c;copy&…

mysql blob hex_数据库的完整备份与恢复 quot;--hex-blobquot; - - ITeye博客

闲言少絮&#xff0c;这个程序利用MySql数据库自带小程序进行数据库的备份和还原。这两个程序分别是&#xff1a;mysql.exe和mysqldump.exe。这两个程序在您安装Mysql数据库的时候会自动安装到数据库的bin目录。这两个程序存在的目录为&#xff1a;C:\Program File\MySQL\MySQL…

android中怎么保存checkbox中的checked属性_Vue 精粹:v-model指令在组件中怎么玩

最近在写组件的时候&#xff0c;遇到了 v-model 的使用问题&#xff0c;在 Vue 官方文档中&#xff0c;有两小端内容是关于 v-model 指令在组件中的使用,查阅文档后&#xff0c;依然不得要领&#xff0c;最后几番折腾&#xff0c;理论结合实践&#xff0c;终于领悟其精髓&#…

linux location root访问文件夹404_如何使网站支持https访问?nginx配置https证书

购买SSL证书要想使用https访问你的网址&#xff0c;首先得拥有颁发的SSL证书。我使用的是免费版&#xff0c;有效期为一年&#xff0c;过期后再重新申请。申请SSL证书购买后&#xff0c;可在搜索框输入证书关键字进入到控制台。点击证书申请&#xff0c;按照提示填写完相关信息…

mysql rank函数_Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

排名函数是Sql Server2005新增的功能&#xff0c;下面简单介绍一下他们各自的用法和区别。我们新建一张Order表并添加一些初始数据方便我们查看效果。表结构和初始数据Sql附上表结构和初始数据图&#xff1a;一、ROW_NUMBERrow_number的用途的非常广泛&#xff0c;排序最好用他…

git2.29.2.2怎么安装_MySQL5.5怎么安装

安装MySQL5.5的步骤&#xff1a;1、 官网下载mysql5.5下载地址&#xff1a;http://dev.mysql.com/downloads/mysql/5.5.html#downloads2、 安装mysql5.5注意&#xff0c;安装之前&#xff0c;请关闭杀毒软件。1)、 打开下载的mysql-5.5.53-winx64.msi2) 、点击下一步3)、 选中复…