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

  1. Python 内置方法和属性应用:反射和单例

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

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

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

  3. python字符串内置方法

    网上已经有很多,自己操作一遍,加深印象. dir dir会返回一个内置方法与属性列表,用字符串'a,b,cdefg'测试一下 dir('a,b,cdefg') 得到一个列表 ['__add__','_ ...

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

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

  5. Python的内置方法(二)

    2019独角兽企业重金招聘Python工程师标准>>> open(name[,mode[,buffering]]):打开文件,返回一个file类型的对象.如果文件不能打开,抛出IOE ...

  6. 二. python面向对象(内置方法and析构函数)

    一. 内置方法和析构函数 __str__() 在调用print 打印对象时自动调用 是给用户用的 是一个描述对象的方法__repr__() 是给机器用的在python 解释器里面直接敲对象在回车后调用 ...

  7. 7.python字符串-内置方法分析

    上篇对python中的字符串内置方法进行了列举和简单说明,但这些方法太多,逐一背下效率实在太低,下面我来对这些方法按照其功能进行总结: 1.字母大小写相关(中文无效) 1.1 S.upper() -& ...

  8. python字典内置方法_柳小白Python学习笔记 12 内置方法之字典方法

    学习字典的时候只学习了最基本的字典定义和创建方式.今天再学习两种字典的创建方法及字典内置方法的使用. 现在春暖花开,所以我用花的元素创建了garden(花园)系列字典,字典的键是flowers(花名) ...

  9. python 类内置方法

    __init__(self,...)      初始化对象,在创建新对象时调用 __del__(self)      释放对象,在对象被删除之前调用 __new__(cls,*args,**kwd)  ...

最新文章

  1. RDKit | 分子的多种构象
  2. python代码函数字符查询宝典书籍_Django基础五之django模型层(一)单表操作
  3. 基于alipay用到的
  4. VC++使用MCI播放音频文件
  5. html网页自动铺满屏幕,如何使HTML元素的区域铺满全屏
  6. MOXy是GlassFish 4中新的默认JSON绑定提供程序
  7. codeforces Gargari and Bishops(很好的暴力)
  8. Python输入输出练习
  9. PCWorld:乔布斯病休遗留诸多问题
  10. python爬虫构建国外代理池_建立爬虫代理ip池
  11. 什么是网站被黑了?网站被黑客攻击怎么办?
  12. 债券数据集:绿色债券数据集、历时新发、发行债券、DCM定价估值四大指标数据
  13. Iris Network Traffic Analyzer简易教程
  14. 【面试题】package有什么作用
  15. Android8.0后静态广播以及有序广播的使用
  16. 2021 年8月份最新数据库排行榜出炉
  17. Android 获取手机联系人代码
  18. 北方工业大学计算机专硕分数线,北方工业大学法硕:近三年分数线汇总,一分钟速了解详细...
  19. 气体全自动切换汇流排液晶控制系统
  20. 每天小练笔8-模拟进程调度

热门文章

  1. kotlin和java差别_Kotlin和Java的常用方法的区别总结
  2. gitlab修改配置重启_centos7下gitlab安装说明
  3. Linux系统自动备份脚本,供参考的Linux系统中自动执行分段备份脚本
  4. 深度学习之基于CNN实现天气识别
  5. 请查收 | 2021 阿里妈妈技术文章回顾
  6. thinkphp session mysql_ThinkPHP实现将SESSION存入MYSQL的方法
  7. systemverilog数据类型
  8. Arrays.sort()方法
  9. 实验7-3-6 字符串转换成十进制整数 (15分)
  10. lisp 河道水面线计算_天然河道水面线计算的几种方法解剖.pdf