Python内置方法和属性应用:反射和单例(推荐)

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内置方法和属性内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python反射和内置方法重写操作详解

    本文实例讲述了Python反射和内置方法重写操作.分享给大家供大家参考,具体如下: isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象,类似 type() class Foo(object): pass obj = Foo() isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Fo

  • 简单谈谈python的反射机制

    对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述python的反射机制的使用场景和核心本质. 一.前言 def f1(): print("f1是这个函数的名字!") s = "f1" print("%s是个字符串" % s) 在上面的代码中,我们必须区分两个概念,f1和"f1

  • 浅谈Python反射 & 单例模式

    反射 什么是反射? - 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) 面向对象中的反射 - 通过字符串的形式来操作(获取.检查.增加.删除)对象中的成员 - python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数: - getattr()   获取属性 - hasattr()  判断对象中是或否拥有特定的值 - setattr()   设置属性 - delattr(obj,'gender')  删除属性 class Info: def __init_

  • 详解python实现小波变换的一个简单例子

    最近工作需要,看了一下小波变换方面的东西,用python实现了一个简单的小波变换类,将来可以用在工作中. 简单说几句原理,小波变换类似于傅里叶变换,都是把函数用一组正交基函数展开,选取不同的基函数给出不同的变换.例如傅里叶变换,选择的是sin和cos,或者exp(ikx)这种复指数函数:而小波变换,选取基函数的方式更加灵活,可以根据要处理的数据的特点(比如某一段上信息量比较多),在不同尺度上采用不同的频宽来对已知信号进行分解,从而尽可能保留多一点信息,同时又避免了原始傅里叶变换的大计算量.以下计

  • Python内置方法和属性应用:反射和单例(推荐)

    1. 前言 python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict.list.set.min.max.range.sorted等.笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享. 2. 内置方法和函数介绍 enumerate 如果你需要遍历可迭代的对象,有需要获取它的序号,可以用enumerate, 每一个next返回的是一个tuple list1 = [1, 2, 3, 4] list2 = [4, 3, 2, 1

  • Python内置方法实现字符串的秘钥加解密(推荐)

    在实际编程开发中,我们会使用到各类的加密算法来对数据和信息进行加密.比如密码中比较常见的MD5加密,以及AES加密等等. 对于密码认证来说,MD5加密是比较适合的,因为其不需要接触到明文的数据,只需要比对MD5加密后的哈希值就能判断数据是否一致:而对于一些在加密后进行解密的数据而言,AES则更加的常用. 在Python中实现AES算法需要借助的第三方库Crypto,其在各个操作系统上的安装方法有些许复杂,所以对于简单的使用有点杀鸡用牛刀的意思.在Mrdoc的开发过程中,我们就遇到了这样的问题.一

  • Python 内置方法和属性详解

    目录 1.1 _del_方法(知道) 1.2 _str_ 方法 总结 1.1 _del_方法(知道) 在Python中 当使用 类名()创建对象时,为对象 分配完空间后,自动 调用 _init_方法: 当一个 对象被从内存中阶段 前,会 自动 调用 _del_方法: 生命周期 1).一个对象从调用 类名()创建,生命周期开始: 2).一个对象的 _del_ 方法一旦被调用,生命周期结束: 3).在对象的生命周期内,可以访问对象属性,或者让对象调用方法: class Cat(): def __in

  • Python内置函数—vars的具体使用方法

    本文文章主要介绍了Python内置函数-vars的具体使用方法,分享给大家,具体如下: 英文文档: vars([object]) Return the __dict__ attribute for a module, class, instance, or any other object with a __dict__ attribute.Objects such as modules and instances have an updateable __dict__ attribute; h

  • Python序列对象与String类型内置方法详解

    本文实例讲述了Python序列对象与String类型内置方法.分享给大家供大家参考,具体如下: 前言 在Python数据结构篇中介绍了Python的序列类型数据结构,这次继续深入的学习序列和String类型对象的内建方法. 软件环境 系统 UbuntuKylin 14.04 软件 Python 2.7.3 IPython 4.0.0 序列类型 序列类型,即由整数进行索引的对象的有序集合.其中又可以分为下面两类: 可变序列:列表,支持元素的插入.删除.替换 不可变序列:元组.字符串 序列的操作方法

  • Python中class内置方法__init__与__new__作用与区别解析

    目录 背景 __init__方法作用 __new__方法作用 __init__ && __new__联系 使用__new__的场景 定义.继承immutable class 使用metaclass 参考文献 背景 最近尝试了解Django中ORM实现的原理,发现其用到了metaclass(元类)这一技术,进一步又涉及到Python class中有两个特殊内置方法__init__与__new__,决定先尝试探究一番两者的具体作用与区别.PS: 本文中涉及的类均为Python3中默认的新式类,

  • python字符串string的内置方法实例详解

    下面给大家分享python 字符串string的内置方法,具体内容详情如下所示: #__author: "Pizer Wang" #__date: 2018/1/28 a = "Let's go" print(a) print("-------------------") a = 'Let\'s go' print(a) print("-------------------") print("hello"

  • Python内置random模块生成随机数的方法

    本文我们详细地介绍下两个模块关于生成随机序列的其他使用方法. 随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入random模块. import random 下面介绍下Python内置的random模块的几种生成随机数的方法. 1.random.random()随机生成 0 到 1 之间的浮点数[0.0, 1.0).注意的是返回的随机数可能会是 0 但

  • Python List列表对象内置方法实例详解

    本文实例讲述了Python List列表对象内置方法.分享给大家供大家参考,具体如下: 前言 在上一篇中介绍了Python的序列和String类型的内置方法,本篇继续学习作为序列类型成员之一的List类型的内置方法. 软件环境 系统 UbuntuKylin 14.04 软件 Python 2.7.3 IPython 4.0.0 列表List 列表是一种容器,存放内存对象的引用.即是任意内存对象的有序集合,不同的类型对象可以存放在同一个列表中.通过索引来访问其中的元素.可以任意的嵌套.伸长.异构.

随机推荐