python反射

python如何使用ctypes调用扩展模块

泄露秘密 提交于 2020-01-28 14:04:34
楔子 我们知道python的执行效率不是很高,而且由于GIL的原因,导致python不能充分利用多核CPU。一般的解决方式是使用多进程,但是多进程开销比较大,而且进程之间的通信也会比较麻烦。因此在解决效率问题上,我们会把那些比较耗时的模块使用C或者C++编写,然后编译成动态链接库,Windows上面是dll,linux上面则是so,编译好之后,交给python去调用。而且通过扩展模块的方式还可以解决python的GIL的问题,因此如果想要利用多核,我们仍然可以通过扩展模块的方式。 python如何调用扩展模块 python调用扩展模块的一种比较简单的方式就是使用ctypes这个库,这个库是python官方提供的,任何一个版本的python都可以使用,我们通过ctypes可以很轻松地调用扩展模块。 演示 #include <stdio.h> void test() { printf("hello world\n"); } 我们定义了一个很简单的函数,下面我们就可以将其编译成扩展模块了。在Windows是dll,linux上是so,编译的命令是一样的。我这里以Windows 为例,记得在Windows上要安装MinGW,或者安装VsCode,我这里使用的是MinGW,因为VsCode太大了。 gcc -o dll文件或者so文件 -shared c或者c++源文件

python模块二(递归,反射,正则表达式)

故事扮演 提交于 2020-01-26 23:18:07
一、递归,阶乘 递归之实例: def func(num): """ 1*2*3*4*5... 计算类型形式的阶乘 :param num: 计算阶乘的最大值 :return: 7 * (7 - 1) """ # 如果参数为1,直接返回1 if num == 1: return 1 # 否则返回2 * (2 - 1) return num * func(num - 1) x = func(5) print(x) # ########print########### 120 print(1 * 2 * 3 * 4 * 5) # ########print########### 120 二、反射 反射关键:      反射: 基于字符串的形式去对象(模块)中操作其成员          基于内存操作的     delattr    删除成员     setattr    设置成员     getattr    获取成员     hasattr    检查成员   学习反射之前先了解一下下面的知识 # 定义一个函数名为f1 def f1(): print('F1') # 字符串f1 "f1" # 那么函数名的f1与字符串的f1是否一样 答案是不一样 f1 是 函数名,代表整个函数体 "f1"是 字符串,仅代表字符串本身 现在以一个实例来学习反射 #!/bin/bin/env python #

面向对象

自闭症网瘾萝莉.ら 提交于 2020-01-26 18:18:38
第六章 面向对象 规范化目录 规范化目录的优点 #1:加载速度块#2:可读性高#3:查询修改代码时都简单​ 规范化目录分析 划归固定的路径 将文件目录的固定路径划分完成​ settings.py配置文件 #1:基本存储的都是变量#2:静态路径,数据库的链接,配置,静态文件的的路径,基本不发生改变的​ src.py主逻辑函数 #主逻辑函数,核心函数:贯穿整个项目的主要功能​ common.py公共组件 #放置一些公用的函数,功能,方便与其他的函数或者业务需求,如:装饰器​ start启动文件 #单独的启动文件,将所有项目的功能单独放置一个文件中,开启项目方便,醒目​ register #用户信息,数据相关,多个文件​ logging日志文件 #记录用户的访问次数,转账,取钱,充钱等等.极了用户干了什么.​ README描述文件 #1:软件定位,软件的基本功能。#2:运行代码的方法: 安装环境、启动命令等。#3:简要的使用说明。#4:代码目录结构说明,更详细点可以说明软件的基本原理。#5:常见问题说明。​ 规范化目录sys模块路径加载 #版本一sys模块内置模块,文件运行时,sys内置模块就会将一些模块 自动 加载到内存. 内置模块. time,json pickle等等.以及当前目录的.如何引用到一个模块最本质的原因在于这个模块名称空间在不在内存.如果直接引用不到一个模块

python之反射

天大地大妈咪最大 提交于 2020-01-26 14:32:26
反射:用字符串数据类型的变量名来访问这个变量的值 反射的方法: getattr hasattr setattr delattr 1、一般的代码编写的方式 class Student: def __init__(self,name): self.name = name def check_course(self): print('check_course') def choose_course(self): print('choose_course') def choosed_course(self): print('查看已选择的课程') stu = Student() num = input('>>>') if num == 'check_course': stu.check_course() elif num == 'choose_course': stu.choose_course() elif num == 'choosed_course': stu.choosed_course() 2、类 静态属性 类方法 静态方法 命名空间.XXX == getattr(命名空间,'XXX') class Student: ROLE = 'STUDENT' @classmethod def check_course(cls): print('查看课程了') @staticmethod

python的反射

孤街浪徒 提交于 2020-01-25 16:19:11
反射 通过字符串来映射实现同名函数功能就是反射。是不是很神奇,对,我都快神奇死了,当我在学函数的时候就在想这个问题,现在就这么被解决了,我果然是个菜鸟。。。 好啦,下面让我自己给自己总结下怎么使用反射, 使用反射一共有四个函数。 hasattr(obj,name)。用来判断,在obj中是否有与name同名的定义的函数与属性。 getattr(obj,name)。用来获取obj 中与name 同名的函数或属性,如果后面加一个可执行的(),函数可执行。 setattr(object,name,v)。用来设置属性或者函数功能。效果等同于object.name= v。 delattr(object,name)。对函数或者数据进行删除。效果等同于del object.name。 对当前模块的类成员进行反射。 需要导入sys模块,然后利用sys.modules[_ name _]就可以确定同名的类。 来源: CSDN 作者: 小狼爱老婆 链接: https://blog.csdn.net/ainiyo_/article/details/103765617

初识反射

扶醉桌前 提交于 2020-01-21 09:40:05
反射 今天新学到一句有“哲学”’的话——Python中的“一切皆对象”。 对一个初学者来说还是比较懵懂的,虽然这两天对对象有了基础的认识,但是怎么能称为一切皆对象呢? 对于狭义上的对象来说,声明了一个类,那么这个类里的所有东西就赋予了通过这个类建造出来的所有对象,那么其它的对象又是通过哪种类来声明出来? 这样随着不断翻阅资料以及前辈的帮助,逐渐认识到,所有的东西要么是自己(我)创建的类声明对象,亦或是Python解释器中关于对象的类使得一些“对象”就这样产生了。理解得很笼统,有很多细节的地方还触及不到,如同蚂蚁去想象宇宙,Python就这样勾起了我更大的求知欲。。。。 在后面的资料中逐渐注意到了一个叫做 反射 的东西,主要用在远程调用数据的方面。 反射是通过字符串来得到目标类中是否有某种操作,亦或使用某种操作而不会因为没有使得运行的程序出错而终止,是一种比较“柔和”的方式,这一点就像是字典操作中的discard()。 主要的操作方式有: hasattr()、getattr()、setattr()、delattr() 先写远程调用的类名,再写要调用的操作名,但是有一个不好的地方在于,你调出来之后并不会告诉你这是一个变量、函数。亦或是一个对象,只有在你使用的时候出错了才知道它不是某种类型,这样就失去了它“柔和”的属性了呀…小小的脑袋,大大的疑惑

单例模式 与 python实现

点点圈 提交于 2020-01-20 04:28:41
单例模式 单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. 比如,某个服务器的配置信息存在在一个文件中,客户端通过AppConfig类来读取配置文件的信息.如果程序的运行的过程中,很多地方都会用到配置文件信息,则就需要创建很多的AppConfig实例,这样就导致内存中有很多AppConfig对象的实例,造成资源的浪费.其实这个时候AppConfig我们希望它只有一份,就可以使用单例模式. 实现单例模式的几种方法 1. 使用模块 其实,python的模块就是天然的单例模式,因为模块在第一次导入的时候,会生成.pyc文件,当第二次导入的时候,就会直接加载.pyc文件,而不是再次执行模块代码.如果我们把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了. 新建一个python模块叫singleton,然后常见以下python文件 mysingleton.py class Singleton(object): def foo(self): pass singleton = Singleton() 使用: from singleton.mysingleton import singleton 2. 使用装饰器 装饰器里面的外层变量定义一个字典,里面存放这个类的实例.当第一次创建的收,就将这个实例保存到这个字典中.

Python魔法方法(一)

风流意气都作罢 提交于 2020-01-19 04:43:06
构造方法 我们最为熟知的基本的魔法方法就是 __init__ ,我们可以用它来指明一个对象初始化的行为。然而,当我们调用 x = SomeClass() 的时候, __init__ 并不是第一个被调用的方法。事实上,第一个被调用的是 __new__ ,这个 方法才真正地创建了实例。当这个对象的生命周期结束的时候, __del__ 会被调用。让我们近一步理解这三个方法: __new__(cls,[…) __new__ 是对象实例化时第一个调用的方法,它只取下 cls 参数,并把其他参数传给 __init__ 。 __new__ 很少使用,但是也有它适合的场景,尤其是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。我不打算深入讨论 __new__ ,因为它并不是很有用, Python文档 中 有详细的说明。 __init__(self,[…]) 类的初始化方法。它获取任何传给构造器的参数(比如我们调用 x = SomeClass(10, ‘foo’) , __init__ 就会接到参数 10 和 ‘foo’ 。 __init__ 在Python的类定义中用的最多。 __del__(self) __new__ 和 __init__ 是对象的构造器, __del__ 是对象的销毁器。它并非实现了语句 del x (因此该语句不等同于 x.__del__())

从Python调用C / C ++?

断了今生、忘了曾经 提交于 2020-01-18 07:32:50
构造与 C 或C ++库的 Python 绑定的最快方法是什么? (如果这很重要,我正在使用Windows。) #1楼 最快的方法是使用 SWIG 。 来自SWIG 教程的示例 : /* File : example.c */ int fact(int n) { if (n <= 1) return 1; else return n*fact(n-1); } 接口文件: /* example.i */ %module example %{ /* Put header files here or function declarations like below */ extern int fact(int n); %} extern int fact(int n); 在Unix上构建Python模块: swig -python example.i gcc -fPIC -c example.c example_wrap.c -I/usr/local/include/python2.7 gcc -shared example.o example_wrap.o -o _example.so 用法: >>> import example >>> example.fact(5) 120 请注意,您必须具有python-dev。 同样在某些系统中,python头文件会根据您的安装方式位于/usr

【Python】调用lua

时光总嘲笑我的痴心妄想 提交于 2020-01-15 01:12:01
1,引言 lua本身又是嵌入语言。在语言本身上又一定的局限性。所以我打算把lua嵌入到python/java中。做调研的时候,java的嵌入较为麻烦,出现了各种问题。后来确定用python来作这个环境。这样能用上python 的协程、多线程。 2,环境搭建 pip install lupa 3,案例 3.1 test.lua function test1 ( params ) return 'test1:' .. params end function test2 ( params ) return 'test2:' .. params end -- 入口函数,实现反射函数调用 function functionCall ( func_name,params ) local is_true,result local sandBox = function ( func_name,params ) local result result = _G [ func_name ] ( params ) return result end is_true,result = pcall ( sandBox,func_name,params ) return result end 3.2 test.py import traceback from lupa import LuaRuntime