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实现的文件同步服务器实例
Jun 02 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
Python 3.8中实现functools.cached_property功能
May 29 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
Python调用.net动态库实现过程解析
Jun 05 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
python中的插入排序的简单用法
Jan 19 Python
用python自动生成日历
Apr 24 Python
如何用python清洗文件中的数据
Jun 18 Python
python随机打印成绩排名表
Jun 23 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无限分类(树形类)的深入分析
2013/06/02 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
Django返回json数据用法示例
2016/09/18 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
Python实现仿射密码的思路详解
2020/04/23 Python
python中re模块知识点总结
2021/01/17 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
安全资金保障制度
2014/01/23 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
vue ref如何获取子组件属性值
2022/03/31 Vue.js