Python 内置方法和属性应用:反射和单例
1. 前言
python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享。
2. 内置方法和函数介绍
enumerate
如果你需要遍历可迭代的对象,有需要获取它的序号,可以用
enumerate
, 每一个next返回的是一个tuplelist1 = [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 = namedef 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 内置方法和属性应用:反射和单例相关推荐
- python内置类属性_Python内置方法和属性应用:反射和单例(推荐)
1. 前言 python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict.list.set.min.max.range.sorted等.笔者最近在做项目框架时 ...
- python getattr_Python 内置方法和属性应用:反射和单例
1. 前言 python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict.list.set.min.max.range.sorted等.笔者最近在做项目框架时 ...
- 面向对象-1-类和对象、基础语法、初始化、内置方法和属性
1. 基本概念 2. 类和对象 例如: 3. 面向对象基础语法 class Cat:def eat(self):print('小猫爱吃鱼')def drink(self):print ('小猫爱喝水' ...
- Python内置方法
一.常用的内置方法 1.__new__ 和 __init__: __new__ 构造方法 .__init__初始化函数 1.__new__方法是真正的类构造方法,用于产生实例化对象(空属性).重写__ ...
- python内置方法怎么使用_python的常用内置方法
__author__ = 'coco' ''' python内置函数 ''' # all() 全为真,才为真 print(all([0,-2,3])) # False print(all([1,-2, ...
- python内置方法+数学模块+随机模块+序列化模块
内置方法 abs 绝对值函数 round 四舍五入 (n.5 n为偶数则舍去 n.5 n为奇数,则进一!) 特点:奇进偶不进 res = round(4.51) #正常的四舍五入 5 res = ro ...
- python内置方法就是内置函数_python内置函数
什么是内置函数? 就是python给你提供的,拿来直接用的函数, 比如print 和 input等等. 截止到python版本3.6.2 python一共提供了68个内置函数. 他们就是python直 ...
- python 内置方法赋值_Python内置数据结构之字符串str
1. 数据结构回顾 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于字符串,但是字符串是不可变序列,因此所有的元素赋值和切片赋值都是非法的. >>> ...
- Python内置方法大全
字典方法 字典.setdefault(key,value)------------如果字典中已经存在相同的key则什么都不做,否则就添加 字典[key]------------------------ ...
最新文章
- SIP协议的传输层原理报文解析(解读rfc3581)(待排版)
- AcWing 143. 最大异或对
- (day 29 - 二叉树的先序遍历 )剑指 Offer 34. 二叉树中和为某一值的路径
- 2022-08-26 Unity视频播放3——VideoPlayer
- photoshop入门教程_Photoshop入门
- 北京地区2009年春运火车票购买指南(V2.5)
- linux-netstat的用法-netstat12种网络连接状态
- Gym100015 I Identity Checker 栈容器使用,数学
- 地下市场金融牌照疯狂买卖:全牌照可以卖十几个亿
- 生硬的论文,非得写什么架构设计
- 多路视频数据实时采集系统设计与实现
- 推荐免费下载大型酒店管理系统源码
- AddressBook 地址簿 (电话簿) 访问与修改-IOS开发
- 利用form表单上传图片,图片保存到本地,得到图片名字(后期可以将图片名字存进数据库)
- sql 中 日期比较
- java 图片去除黑边,头顶黑边,求大神解决
- 矢量图eps在word中的使用的方法
- Python标示符和关键字
- 软件测试工程师必会:BUG分类及推进解决方案
- WPF与echarts联动
热门文章
- 智能摄像头——小觅智能摄像头
- linux——用户理解及管理
- Nginx教程系列一:Nginx简介(反向代理、负载均衡)
- Java进阶:图文并茂解析HashMap源码
- python毒酒检测_检测OpenSSL漏洞的脚本
- MySQL 条件查询 limit、in、between and、like等等
- 八皇后问题初始思路python_Python 学习笔记(一)10行代码解决八皇后问题
- php显示玩家,php.取得玩家IP
- 关于windows内存泄露思考
- python中elif老是出错_python为什么会存在if执行了依然会执行elif的情况?