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 = 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 内置方法和属性应用:反射和单例相关推荐

  1. python内置类属性_Python内置方法和属性应用:反射和单例(推荐)

    1. 前言 python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict.list.set.min.max.range.sorted等.笔者最近在做项目框架时 ...

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

    1. 前言 python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict.list.set.min.max.range.sorted等.笔者最近在做项目框架时 ...

  3. 面向对象-1-类和对象、基础语法、初始化、内置方法和属性

    1. 基本概念 2. 类和对象 例如: 3. 面向对象基础语法 class Cat:def eat(self):print('小猫爱吃鱼')def drink(self):print ('小猫爱喝水' ...

  4. Python内置方法

    一.常用的内置方法 1.__new__ 和 __init__: __new__ 构造方法 .__init__初始化函数 1.__new__方法是真正的类构造方法,用于产生实例化对象(空属性).重写__ ...

  5. python内置方法怎么使用_python的常用内置方法

    __author__ = 'coco' ''' python内置函数 ''' # all() 全为真,才为真 print(all([0,-2,3])) # False print(all([1,-2, ...

  6. python内置方法+数学模块+随机模块+序列化模块

    内置方法 abs 绝对值函数 round 四舍五入 (n.5 n为偶数则舍去 n.5 n为奇数,则进一!) 特点:奇进偶不进 res = round(4.51) #正常的四舍五入 5 res = ro ...

  7. python内置方法就是内置函数_python内置函数

    什么是内置函数? 就是python给你提供的,拿来直接用的函数, 比如print 和 input等等. 截止到python版本3.6.2 python一共提供了68个内置函数. 他们就是python直 ...

  8. python 内置方法赋值_Python内置数据结构之字符串str

    1. 数据结构回顾 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于字符串,但是字符串是不可变序列,因此所有的元素赋值和切片赋值都是非法的. >>> ...

  9. Python内置方法大全

    字典方法 字典.setdefault(key,value)------------如果字典中已经存在相同的key则什么都不做,否则就添加 字典[key]------------------------ ...

最新文章

  1. SIP协议的传输层原理报文解析(解读rfc3581)(待排版)
  2. AcWing 143. 最大异或对
  3. (day 29 - 二叉树的先序遍历 )剑指 Offer 34. 二叉树中和为某一值的路径
  4. 2022-08-26 Unity视频播放3——VideoPlayer
  5. photoshop入门教程_Photoshop入门
  6. 北京地区2009年春运火车票购买指南(V2.5)
  7. linux-netstat的用法-netstat12种网络连接状态
  8. Gym100015 I Identity Checker 栈容器使用,数学
  9. 地下市场金融牌照疯狂买卖:全牌照可以卖十几个亿
  10. 生硬的论文,非得写什么架构设计
  11. 多路视频数据实时采集系统设计与实现
  12. 推荐免费下载大型酒店管理系统源码
  13. AddressBook 地址簿  (电话簿) 访问与修改-IOS开发
  14. 利用form表单上传图片,图片保存到本地,得到图片名字(后期可以将图片名字存进数据库)
  15. sql 中 日期比较
  16. java 图片去除黑边,头顶黑边,求大神解决
  17. 矢量图eps在word中的使用的方法
  18. Python标示符和关键字
  19. 软件测试工程师必会:BUG分类及推进解决方案
  20. WPF与echarts联动

热门文章

  1. 智能摄像头——小觅智能摄像头
  2. linux——用户理解及管理
  3. Nginx教程系列一:Nginx简介(反向代理、负载均衡)
  4. Java进阶:图文并茂解析HashMap源码
  5. python毒酒检测_检测OpenSSL漏洞的脚本
  6. MySQL 条件查询 limit、in、between and、like等等
  7. 八皇后问题初始思路python_Python 学习笔记(一)10行代码解决八皇后问题
  8. php显示玩家,php.取得玩家IP
  9. 关于windows内存泄露思考
  10. python中elif老是出错_python为什么会存在if执行了依然会执行elif的情况?