14ch

14.1可调用对象

Python有四种可调用对象(可以通过函数操作符‘()’来调用的对象):函数、方法、类、类的实例

14.1.1函数

1.内建函数(BIF)

内建函数是用C/C++写的,编译过后放入Python解释器,然后把它们作为第一名称空间的一部分加载进系统。如之前章节所述,这些函数在_bulitin_模块里,并作为__builtins__模块导入到解释器中

属性 描述
bif.__doc__ 文档字符串(或None)
bif.__name__ 字符串类型的文档名字
bif.__self__ 设置为None(保留给内建方法)
bif.__module__ 存放bif定义的模块名字(或None)

可以用dir()列出函数的所有属性

>>> dir(type)
[‘__abstractmethods__‘, ‘__base__‘, ‘__bases__‘, ‘__basicsize__‘, ‘__call__‘, ‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dictoffset__‘, ‘__doc__‘, ‘__eq__‘, ‘__flags__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__instancecheck__‘, ‘__itemsize__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__mro__‘, ‘__name__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasscheck__‘, ‘__subclasses__‘, ‘__subclasshook__‘, ‘__weakrefoffset__‘, ‘mro‘]

从内部机制来看,因为内建函数和内建方法属于相同的类型,所以对BIF或者BIM调用type()的结果是

>>> type(dir)
<type ‘builtin_function_or_method‘>

注意这不能应用于工厂函数,因为type()正好会返回产生对象的类型

2.用户定义的函数(UDF)

用户定义的函数通常是用Python写的,定义在模块的最高级,因此会作为全局名称空间的一部分装载到系统中。函数也可以在其他函数体内定义,并且由于在2.2中嵌套作用域的改进,我们现在可以对多重嵌套作用域中的属性进行访问。可以用func_closure属性来勾住在其他地方定义的属性。

UDF也有许多属性,其中最特殊和最令人感兴趣的属性列表如下

属性 描述
udf.__doc__ 文档字符串,也可以用udf.func_doc
udf.__name__ 字符串类型的函数名字,也可以用udf.func_name
udf.func_code 字节编译的代码对象
udf.func_defaults 默认的参数元组
udf.func_globals 全局名称空间字典;和从函数内部调用globals(x)一样
udf.func_dict 函数属性的名称空间
udf.func_doc (见上面的udf.__doc__)
udf.func_name (见上面的udf.__name__)
udf.func_closure 包含了自由变量的引用的单元对象元组(自用变量在UDF中使用,但在别处定义)

3.lambda表达式

通过lambda来创建函数的对象除了没有命名之外,享有和用户自定义函数相同的属性,__name__或者func_name属性给定为字符串"<lambda>"。

14.1.2方法

1.内建方法

对于内建方法,type()工厂函数给出了和内建函数相同的输出。此外,内建方法和内建函数两者也享有相同属性,不同之处在于内建方法的__self__属性指向一个Python对象,而内建函数指向None。

对于类和实例都可以通过dir来获取方法属性,对于内建方法也是如此。

2.用户定义的方法(UDM)

用户定义的方法包含在类定义之中,只是拥有标准函数的包装,仅有定义它们的类可以使用。如果没有在子类定义中被覆盖掉,也可以通过子类实例来调用它们。正如13章中解释的,UDM与类对象是关联的(非绑定方法),但是只能通过类的实例来调用(绑定方法)。

属性 描述
udm.__doc__ 文档字符串(与udm.im_fuc.__doc__相同)
udm.__name__ 字符串类型的方法名字(与udm.im_fuc.__name__相同)
udm.__module__ 定义udm的模块的名字(或None
udm.im_class 方法相关联的类(如果是非绑定,那么为要求是udm的类
udm.im_func 方法的函数对象
udm.im_self 如果绑定的话为相关联的实例,否则为None

14.1.3 类

时间: 2024-10-11 13:23:26

14ch的相关文章

PE文件结构整理

一直想做一个PE结构的总结,只是学的时候有很多东西就没搞懂,加上时间一长,很多知识也早忘了,也就一直没完成.这几天从头看了下,好不容易理清楚了,整理一下,以免又忘了 pe文件框架结构,图片贴过来太模糊了就画个表格代替一下 DOS文件头 PE文件头  区块表    各区块    调试信息   DOS文件头 DOS文件头包括DOS MZ头和DOS stub MS-DOS头部是一个IMAGE_DOS_HEADER结构(代码来自windows.inc) IMAGE_DOS_HEADER STRUCT +

反调试-去除各种反调试

前不久破解一个软件的时候遇到了各种反调试,折腾的自己各种难受,最终爆破了之后感觉心情大快就顺手写下了这篇文章 使用工具 十六进制分析工具:winhex 查壳工具:PEID 脱壳工具:ollydump插件或者LordPE 脱壳修复工具:ImportREC 逆向工具:OllyDbg 分析过程 PE修复 打开源程序所在文件夹,发现有一个crackme,双机运行程序发现有这个提示: 应该是文件的PE结构被修改了,winhex载入分析发现: 果然是PE结构的问题,在DOS头后面的PE头的16进制应该为50

css 打字动画

使用 css 将文字逐字打出 <h1>css is awesome</h1> 要使<h1>标签里的文字逐字打出,对应的样式如下: h1{ width: 14ch;/×文本的宽度×/ overflow: hidden; white-space: nowrap; border-right: .05em solid transparent; animation: typing 4s steps(14), caret 1s steps(1) infinite; } @keyfr

PE结构、SEH相关知识学习笔记

原文:http://www.pediy.com/kssd/index.html -- 病毒技术 -- 病毒知识 -- Anti Virus专题 PE结构的学习 原文中用fasm自己构造了一个pe,这里贴一个用masm的,其实是使用WriteFile API将编写的PE数据写成文件~也没啥好说的,PE结构在这里没有仔细介绍,需要可以另外查询,剩下要说的的基本都在代码注释里了 参考:点击打开链接(PEDIY技术之新思路(二)_用'高级'编译器MASM实现自定义PE文件结构) Pe.asm: REMO

利用PE数据目录的导入表获取函数名及其地址

PE文件是以64字节的DOS文件头开始的(IMAGE_DOS_HEADER),接着是一段小DOS程序,然后是248字节的 NT文件头(IMAGE_NT_HEADERS),NT的文件头位置由IMAGE_DOS_HEADER的e_lfanew给出! NT文件头的前4个字节是文件签名(“PE00"字符串),紧接着是20字节的IMAGE_FILE_HEADER结构,它的 后面是224字节的IMAGE_OPTIONAL_HEADER结构,而就在这个结构里,里面有模块基地址,代码和数据大 小和基地址.线程堆

编写自定义PE结构的程序(如何手写一个PE,高级编译器都是编译好的PE头部,例如MASM,TASM等,NASM,FASM是低级编译器.可以自定义结构)

正在学PE结构...感谢个位大哥的文章和资料...这里先说声谢谢 一般高级编译器都是编译好的PE头部,例如MASM,TASM等一直都说NASM,FASM是低级编译器.可以自定义结构但是苦于无人发布相关文章说明..我这里就简单的用NASM写一下由于刚学PE结构许多东西都不太懂希望个位大侠指点如何打造一个迷你的PE结构..我暂只只能作到617字节下面随着学习的深入...还有更迷你的PE出现... 代码可以直接编译..编译参数:nasmw -fbin MsgBoxA.asm -o MsgBoxA.ex

攻防世界(XCTF)逆向部分write up(一)

晚上做几个简单的ctf逆向睡的更好 logmein elf文件 ida看看main函数伪代码 void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { size_t v3; // rsi int i; // [rsp+3Ch] [rbp-54h] char s[36]; // [rsp+40h] [rbp-50h] int v6; // [rsp+64h] [rbp-2Ch] __int64 v7; // [rsp+6

01-从零开始用IDA做逆向

0x01.IDA是什么 交互式反汇编器专业版(Interactive Disassembler Professional)简称为IDA.IDA Pro是一款支持交互.可编程的.扩展插件.支持多种处理器的逆向工程利器. 0x02.为什么要用IDA Pro? 为什么要用IDA?因为OD是一个只能调试32位程序的调试器.而IDA Pro可以调试32位.64位的程序.除了可以静态反汇编程序,还支持作为调试器对程序调试. 中国人逆向喜欢用OllyDbg:https://ti.360.net/blog/ar