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之list和str比较
Sep 20 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
python删除字符串中指定字符的方法
Aug 13 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
python制作填词游戏步骤详解
May 05 Python
深入浅析Python 中 is 语法带来的误解
May 07 Python
Python的log日志功能及设置方法
Jul 11 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
Jul 28 Python
Python3批量移动指定文件到指定文件夹方法示例
Sep 02 Python
Python装饰器结合递归原理解析
Jul 02 Python
教你用Python+selenium搭建自动化测试环境
Jun 18 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实现paypal 授权登录
2015/05/28 PHP
php post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
js 文本滚动效果的实例代码
2013/08/17 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
详解js类型判断
2018/05/22 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
vue select选择框数据变化监听方法
2018/08/24 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
python中pivot()函数基础知识点
2021/01/03 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
路政管理专业推荐信
2013/11/11 职场文书
剪彩仪式主持词
2014/03/19 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
财务管理专业自荐书
2014/09/02 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
销售合作意向书范本
2015/05/08 职场文书
java泛型通配符详解
2021/07/25 Java/Android
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL