什么是自省
在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大的灵活性和控制力。
一旦使用了支持自省的编程语言,就会产生类似这样的感觉:“未经检查的对象不值得实例化。”
sys模块
sys模块是提供关于 Python 本身的详尽内在信息的模块。通过导入模块,并用点(.)符号引用其内容(如变量、函数和类)来使用模块。sys 模块包含各种变量和函数,它们揭示了当前的 Python 解释器有趣的详细信息。
首先,我们将导入 sys 模块。然后,我们会输入 sys.executable 变量,它包含到 Python 解释器的路径:
>>>sys.executable
'/usr/bin/python'
platform 变量告诉我们现在处于什么操作系统上:
>>>sys.platform
'darwin'
>>>sys.version
'2.7.2 (default, Jun 16 2012, 12:38:40) \n[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)]'
>>>sys.version_info
sys.version_info(major=2, minor=7, micro=2, releaselevel='final', serial=0)
>>>sys.maxint
9223372036854775807
argv 变量是一个包含命令行参数的列表(如果参数被指定的话)。第一项 argv[0] 是所运行脚本的路径。当我们以交互方式运行 Python 时,这个值是空字符串:
>>>sys.argv
['/usr/local/bin/ipython']
>>>sys.path
['',
'/usr/local/bin',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
'/Library/Python/2.7/site-packages',
'/Library/Python/2.7/site-packages/IPython/extensions']
id函数
id(object)函数是返回对象object在其生命周期内位于内存中的地址,id函数的参数类型是一个对象。
>>>a = 111
>>>id(a)
140239460979432
>>>b = a
>>>id(b)
140239460979432
>>>id(111)
140239460979432
dir函数
尽管查找和导入模块相对容易,但要记住每个模块包含什么却不是这么简单。Python 提供了一种方法,可以使用内置的 dir() 函数来检查模块(以及其它对象)的内容。dir() 函数可能是 Python 自省机制中最著名的部分了。它返回传递给它的任何对象的属性名称经过排序的列表。如果不指定对象,则 dir() 返回当前作用域中的名称。
sys模块的属性
>>>dir(sys)
['__displayhook__',
'__doc__',
'__excepthook__',
'__name__',
'__package__',
'__stderr__',
'__stdin__',
'__stdout__',
'_clear_type_cache',
'_current_frames',
'_getframe',
'_mercurial',
'api_version',
'argv',
'builtin_module_names',
'byteorder',
'call_tracing',
'callstats',
'copyright',
'displayhook',
'dont_write_bytecode',
'exc_clear',
'exc_info',
'exc_type',
'excepthook',
'exec_prefix',
'executable',
'exit',
'exitfunc',
'flags',
'float_info',
'float_repr_style',
'getcheckinterval',
'getdefaultencoding',
'getdlopenflags',
'getfilesystemencoding',
'getprofile',
'getrecursionlimit',
'getrefcount',
'getsizeof',
'gettrace',
'hexversion',
'last_traceback',
'last_type',
'last_value',
'long_info',
'maxint',
'maxsize',
'maxunicode',
'meta_path',
'modules',
'path',
'path_hooks',
'path_importer_cache',
'platform',
'prefix',
'ps1',
'ps2',
'ps3',
'py3kwarning',
'setcheckinterval',
'setdlopenflags',
'setprofile',
'setrecursionlimit',
'settrace',
'stderr',
'stdin',
'stdout',
'subversion',
'version',
'version_info',
'warnoptions']
string的属性
>>>dir(str)
['__add__',
'__class__',
'__contains__',
'__delattr__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__getitem__',
'__getnewargs__',
'__getslice__',
'__gt__',
'__hash__',
'__init__',
'__le__',
'__len__',
'__lt__',
'__mod__',
'__mul__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__rmod__',
'__rmul__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'_formatter_field_name_split',
'_formatter_parser',
'capitalize',
'center',
'count',
'decode',
'encode',
'endswith',
'expandtabs',
'find',
'format',
'index',
'isalnum',
'isalpha',
'isdigit',
'islower',
'isspace',
'istitle',
'isupper',
'join',
'ljust',
'lower',
'lstrip',
'partition',
'replace',
'rfind',
'rindex',
'rjust',
'rpartition',
'rsplit',
'rstrip',
'split',
'splitlines',
'startswith',
'strip',
'swapcase',
'title',
'translate',
'upper',
'zfill']
callable函数
callable 函数, 可以检查一个对象是否是可调用的 (无论是直接调用或是通过 apply)。
对于函数, 方法, lambda 函式, 类, 以及实现了__call__方法的类实例, 它都返回 True。
>>>callable(len)
True
>>>callable(os)
False
>>>class A:
.....: def __init__(self):
.....: self.a = 'apple'
.....:
>>>callable(A)
True
>>>a = A()
>>>callable(a)
False
>>>class B:
.....: def __init__(self):
.....: self.b = 'banana'
.....: def __call__(self):
.....: self.c = 'orange'
.....:
>>>instantB = B()
>>>callable(instantB)
True
属性
class A:
def __init__(self):
self.name = 'my name is a'
def method(self):
print "method print"
a = A()
hasattr函数
简介
hasattr(object,name)
用来检查object中是否有name的属性,返回一个布尔值。
实例
print hasattr(a,'name') #true
print hasattr(a,'age') #false
getattr函数
简介
getattr(object,name)或者getattr(object,name,default)
getattr可以获得对象的方法或者属性的引用
如果object是一个模块,那么name可以是模块中的类,方法或者全局变量中的一个
实例
print getattr(a, 'name', 'default') #如果有属性name则打印name,否则打印default
print getattr(a, 'age', 'default') #如果有属性age则打印age,否则打印default
print getattr(a, 'method', 'default')
#如果有方法method,否则打印其地址,否则打印default
print getattr(a, 'method', 'default')()
#如果有方法method,运行函数并打印None否则打印default
setattr函数
简介
setattr(object,name,val)
这个函数将为object名为name的属性赋值为val,相当于object.name=val
实例
setattr(a,'age',12)
print getattr(a,'age',10) #12