什么是自省
在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大的灵活性和控制力。
一旦使用了支持自省的编程语言,就会产生类似这样的感觉:“未经检查的对象不值得实例化。”
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‘]
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