Python内置方法和属性应用:反射和单例(推荐)


Posted in Python onJune 19, 2020

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._instance 
 def __init__(self, name): 
 self.name = name 
a = 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 methodcaller 
class Foo(): 
 """this is test class""" 
 def __init__(self, name): 
 self.name = name 
 def 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内置方法和属性应用:反射和单例的文章就介绍到这了,更多相关Python内置方法和属性内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python访问纯真IP数据库脚本分享
Jun 29 Python
python&amp;MongoDB爬取图书馆借阅记录
Feb 05 Python
Python ftp上传文件
Feb 13 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
Python WSGI的深入理解
Aug 01 Python
django 通过URL访问上传的文件方法
Jul 28 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
win10从零安装配置pytorch全过程图文详解
May 08 Python
详解python with 上下文管理器
Sep 02 Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 #Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 #Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 #Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 #Python
Python实现爬取并分析电商评论
Jun 19 #Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 #Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 #Python
You might like
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
python实现批量修改文件名
2020/03/23 Python
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
银行实习自我鉴定
2013/10/12 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
个人作风建设心得体会
2014/10/22 职场文书
公务员考察材料范文
2014/12/23 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python