Python自省学习

1. 访问对象的属性

class MyClass():
    a=‘1‘
    b=‘2‘
    def __init__(self):
        pass
    def write(self):
        print self.a,self.b
myClass=MyClass()
print dir(myClass)
print dir(MyClass)

print hasattr(MyClass,‘a‘)
print getattr(MyClass,‘a‘)
print setattr(MyClass,‘a‘,‘11‘)
print getattr(MyClass,‘a‘)

输出:

[‘__doc__‘, ‘__init__‘, ‘__module__‘, ‘a‘, ‘b‘, ‘write‘]
[‘__doc__‘, ‘__init__‘, ‘__module__‘, ‘a‘, ‘b‘, ‘write‘]
True
1
None
11

访问对象属性的方法有,dir,hasattr,getattr,setattr

用setattr可以修改类的熟悉(不是实例),这个比较厉害。

import os
class MyClass():
    ‘‘‘
    aaa
    ‘‘‘

    a=‘1‘
    b=‘2‘
    def __init__(self):
        pass
    def write(self):
        print self.a,self.b
myClass=MyClass()

print dir(MyClass)
print MyClass.__name__    #对象的名称
print MyClass.write.func_code   #对象的代码
print MyClass.__doc__  #对象的文档
print MyClass.__dict__  #对象所有的属性和方法,与dir类似,但是格式是字典
print os.__file__  #对象所在的路径

输出:

[‘__doc__‘, ‘__init__‘, ‘__module__‘, ‘a‘, ‘b‘, ‘write‘]
MyClass
<code object write at 0000000001D71530, file "E:/myDemo/myDemo/?????/z1.py", line 13>

    aaa

{‘a‘: ‘1‘, ‘__module__‘: ‘__main__‘, ‘b‘: ‘2‘, ‘write‘: <function write at 0x00000000025AEC18>, ‘__doc__‘: ‘\n    aaa\n    ‘, ‘__init__‘: <function __init__ at 0x00000000025AEBA8>}
C:\Python27\lib\os.pyc

__doc__返回这个对象的文档,对象下面用三个引号括住的为文档

print isinstance(myClass,MyClass)   #检验某实例对象是否是某个类型

总结:

方法或属性 作用
dir() 返回一个对象拥有的方法和属性的列表
__dict__ 返回一个对象拥有的方法和属性的字典
__name__ 返回对象名称
__doc__ 返回对象的文档
__self__ 返回对象自身
__file__ 返回对象的路径
__module__ 返回对象所在的模块
__func__ 返回对象的代码
__class__ 返回对象的类
isinstace 检验某实例对象是否是某个类型

 2.代码块

•co_argcount: 普通参数的总数,不包括*参数和**参数。

•co_names: 所有的参数名(包括*参数和**参数)和局部变量名的元组。

•co_varnames: 所有的局部变量名的元组。

•co_filename: 源代码所在的文件名。

•co_flags: 这是一个数值,每一个二进制位都包含了特定信息。较关注的是0b100(0x4)和0b1000(0x8),如果co_flags & 0b100 != 0,说明使用了*args参数;如果co_flags & 0b1000 != 0,说明使用了**kwargs参数。另外,如果co_flags & 0b100000(0x20) != 0,则说明这是一个生成器函数(generator function)。

class MyClass():
    ‘‘‘
    aaa
    ‘‘‘

    a=‘1‘
    b=‘2‘
    def __init__(self):
        pass
    def write(self,c,d):
        print self.a,self.b
myClass=MyClass()

print MyClass.write.func_code.co_argcount  # 3
print MyClass.write.func_code.co_names     # (‘a‘, ‘b‘)
print MyClass.write.func_code.co_varnames  # (‘self‘, ‘c‘, ‘d‘)
print MyClass.write.func_code.co_filename  # E:/myDemo/myDemo/?????/z2.py

3.栈帧(frame)

•f_back: 调用栈的前一帧。

•f_code: 栈帧对应的code对象。

•f_locals: 用在当前栈帧时与内建函数locals()相同,但你可以先获取其他帧然后使用这个属性获取那个帧的locals()。

•f_globals: 用在当前栈帧时与内建函数globals()相同,但你可以先获取其他帧……。

import inspect

def add(x, y=1):
    f = inspect.currentframe()
    print f.f_locals    # {‘y‘: 1, ‘x‘: 2, ‘f‘: <frame object at 0x00000000026C19B8>}
    print f.f_globals   #返回全局变量   {‘__builtins__‘: <module ‘__builtin__‘ (built-in)>, ‘__file__‘: ‘E:/myDemo/myDemo/\xd7\xd4\xca\xa1\xd1\xa7\xcf\xb0/z2.py‘, ‘inspect‘: <module ‘inspect‘ from ‘C:\Python27\lib\inspect.pyc‘>, ‘__author__‘: ‘[email protected]‘, ‘add‘: <function add at 0x00000000026C2518>, ‘__name__‘: ‘__main__‘, ‘__package__‘: None, ‘os‘: <module ‘os‘ from ‘C:\Python27\lib\os.pyc‘>, ‘__doc__‘: None}

    print f.f_code      #  <code object add at 0000000001DD6E30, file "E:/myDemo/myDemo/?????/z2.py", line 6>
    print f.f_back      #  <frame object at 0x00000000025D01C8>
    return x+y
add(2)

4.追踪

•tb_next: 追踪的下一个追踪对象。

•tb_frame: 当前追踪对应的栈帧。

•tb_lineno: 当前追踪的行号。

import sys
def div(x, y):
    try:
        return x/y
    except:
        tb = sys.exc_info()[2]  # return (exc_type, exc_value, traceback)
        print tb
        print tb.tb_lineno  # "return x/y" 的行号  6
        print tb.tb_frame.f_locals  #返回跳出程序时的栈帧  {‘y‘: 0, ‘x‘: 1, ‘tb‘: <traceback object at 0x000000000271FE88>}
div(1, 0)

参考:http://developer.51cto.com/art/201101/242703.htm

Python自省学习

时间: 2024-10-25 13:45:57

Python自省学习的相关文章

python基础学习12(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #python class #面向对象编程oop思想,3个特性:封装.继承.多态,在其他方面的功能,比如重载,模拟等,也可以自定义自己需要的类 #在python中,面向对象主要2个:类和类实例 #类与实例 #类与实例有关

Python爬虫学习路线,强烈建议收藏这十一条

(一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量.数据结构.语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Python 简介 | 菜鸟教程 2.看完基础后,就是做一些小项目巩固基础,比方说:做一个终端计算器,如果实在找不到什么练手项目,可以在 Codecademy - learn to code, interactively, for free 上面进行练习. 如果时间充裕的

在python下学习libsvm

1.下载libsvm,python,gnuplot(链接网上全有,压缩包自己保留着) 2.在python上的实现(主要用截图的形式展现) (1)输入命令寻求最优参数 (2) 参数c,g输出结果 gnuplot输出图像 (3)最后输入训练数据,训练数据,通过建立模型进行预测 大概也就这样了,grid.py里面需要改下gnuplot的路径 在python下学习libsvm,布布扣,bubuko.com

python的学习内容

Python的学习路线 掌握基本的语法 这个入门的东西很多,最好的当然是去看官方的文档,如果英语不好那就另当别论,其次看一些优秀的书籍,当然这个也是耗费时间的,但是如果你要是速成,速度的速,那通过一些博客.视频其实也不失为好的方式,起码上手更容易一些了,尤其是你真正的第一门语言. 掌握常用的库 使用成熟可靠的第三方库是多么的高效,尤其是你就几个人小打小闹的时候,重复造轮子是多么的没有必要,但是你必须理解人家的机制,等你用第三方库多了,有能力写自己的库的时候,那我就是真正的恭喜你了. 自动化运维相

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

python模块学习(2)——re模块

正则表达式并不是python的一部分,正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同:但不用担心,不被支持的语法通常是不常用的部分.如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了. 下图展示了使用正则表达式进行匹配的流程:  正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符

[Python]webservice 学习(4) -- Django+soap

前面学习使用soaplib搭建基于soap的webservice服务,我这个web项目其实只是要提供一两个webservice接口,如果直接写两个脚本外挂感觉挺麻烦,于是想能不能和web框集成到一起.于是在google上搜索,最后在github上找到了这么一段代码,原文地址为https://gist.github.com/rotaris/935809,于是我写简单写了一个demo放到了github上.代码上没有什么变化,只是直接创建了一个小项目,也许能容易看. 项目地址为: https://gi

Python Click 学习笔记(转)

原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发的一个小工具需要在命令行环境下操作,就写个学习笔记. 国际惯例,先来一段 "Hello World" 程序(假定已经安装了 Click 包). # hello.py import click @click.command() @click.option('--count', default

python基础学习日志day5-各模块文章导航

python基础学习日志day5---模块使用 http://www.cnblogs.com/lixiang1013/p/6832475.html python基础学习日志day5---time和datetime模块 http://www.cnblogs.com/lixiang1013/p/6848245.html python基础学习日志day5---random模块http://www.cnblogs.com/lixiang1013/p/6849162.html python基础学习日志da