1. 访问对象的属性

class MyClass():
a=''
b=''
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','')
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=''
b=''
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': '', '__module__': '__main__', 'b': '', '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=''
b=''
def __init__(self):
pass
def write(self,c,d):
print self.a,self.b
myClass=MyClass() print MyClass.write.func_code.co_argcount #
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__': 'kevinlu1010@qq.com', '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)

同时可以把错误的信息记录起来,后面可以print或者输出到日志上

try:
a=1/0
except:
s=traceback.format_exc()
print s

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

Python自省学习的更多相关文章

  1. 4.《python自省指南》学习

    前言   前面几篇博客我都是通过python自省来分析代码并试图得出结论.当然,仅仅通过自省能解决的问题有限,但遇到问题还是不自主的去用这个功能,觉得对于认识代码的含义还是有一定帮助的.而这些自省的知 ...

  2. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  3. 60分钟Python快速学习(给发哥一个交代)

    60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...

  4. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

  5. python爬虫学习 —— 总目录

    开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...

  6. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

  7. python 线程学习

    彩照 一.学习[1] # -*- coding: utf-8 -*- import time import thread def timer(no, interval): cnt = 0 while ...

  8. Openstack python api 学习文档 api创建虚拟机

    Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...

  9. python自省指南

    深入python中对自省的定义: python的众多强大功能之一,自省,正如你所知道的,python中万物皆对象,自省是指代码可以查看内存中以对象形式存在的其他模块和函数,获取它们的信息,并对它们进行 ...

随机推荐

  1. (function(){}).call(window) 严格模式匿名函数的this指向undefined

    上次在群里,看到有人发出 (function(){}).call(window) 这么一段代码,问这有什么意义,匿名函数中的this不是始终都指向window的么,为什么还要call,我当时也很疑惑. ...

  2. [Effective C++ --026]尽可能延后变量定义式的出现时间

    引言 每一次构造和析构都需要成本,因此我们在设计代码的时候,应该尽可能考虑到构造和析构的成本. 第一节 延后实现 考虑有以下的代码: void encrypt(string& s); stri ...

  3. Beyond MySQL --Branching the popular database--转载

    原文:http://www.ibm.com/developerworks/library/os-beyondmysql/ Introduction MySQL is one of the most p ...

  4. 使用ueditor时候修改图片路径及其相关信息

    ueditor功能比较强大  使用也比较方便 但是有一些东西是需要我们自己根据实际情况去设置的 以下是关于图片/涂鸦/视频等上传信息的更改: 首先我们要找到配置文件config.json 注意不是co ...

  5. 用grunt搭建自动化的web前端开发环境-完整教程

    原稿:http://www.cnblogs.com/wangfupeng1988/p/4561993.html#!comments jQuery在使用grunt,bootstrap在使用grunt,百 ...

  6. matlab——sparse函数和full函数(稀疏矩阵和非稀疏矩阵转换)

    函数功能:生成稀疏矩阵 使用方法 :S = sparse(A) 将矩阵A转化为稀疏矩阵形式,即矩阵A中任何0元素被去除,非零元素及其下标组成矩阵S.如果A本身是稀疏的,sparse(S)返回S. S ...

  7. 使用MVCJqGrid的心得

    最近公司网站进行升级,项目要用.net mvc,mysql和轻量级orm框架dapper.由于美工页面出不来啊,让我先写简单写写后台的列表,同事说用MvcJqGrid,也得到了架构的同意. 可是不得不 ...

  8. linux+asp.net core+nginx+sql server

    Linux Disibutaion:Ubuntu 16.04.1 LTS Web Server:Nginx.Kestrel 安装.net core sudo sh -c 'echo "deb ...

  9. sql 更新重复数据只取一条记录

    select s.*  from (     select *, row_number() over (partition by PersonnelAccount order BY Personnel ...

  10. WCF与Web API 区别(应用场景)

    Web api  主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回 ...