
正文
关于PYTHON的反射,装饰的练习
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
从基本概念,简单例子才能慢慢走到高级一点的地方。
另外,PYTHON的函数式编程也是我很感兴趣的一点。
总体而言,我觉得OOP可以作大的框架和思路,FP能作细节实现时的优雅牛X。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
“自省”应该是原本的概念,特指在运行时获得object自身信息,这一能力
“反射”是自省的一种实现方式,是具体的。
自省是“道”,反射是“术”。
好比“变量作用域”是一种概念,而“闭包”是作用域中的一种特定技术。
一种语言可以有完整的自省能力而没有“反射”,也可以有完整的作用域功能而没有“闭包”
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import timedef timeit(func): def wrapper(): start = time.clock() func() end = time.clock() print 'used: ', end - start return wrapper@timeit# foo = timeit(foo)def foo(): print 'in foo()'print foo()
#coding: UTF-8import sys # 模块,sys指向这个模块对象import inspectdef foo(): pass # 函数,foo指向这个函数对象class Cat(object): # 类,Cat指向这个类对象 def __init__(self, name='kitty'): self.name = name def sayHi(self): # 实例方法,sayHi指向这个方法对象,使用类或实例.sayHi访问 print self.name, 'says Hi!' # 访问名为name的字段,使用实例.name访问cat = Cat() # cat是Cat类的实例对象print Cat.sayHi # 使用类名访问实例方法时,方法是未绑定的(unbound)print cat.sayHi # 使用实例访问实例方法时,方法是绑定的(bound)cat = Cat('kitty')print cat.name # 访问实例属性cat.sayHi() # 调用实例方法print dir(cat) # 获取实例的属性名,以列表形式返回if hasattr(cat, 'name'): # 检查实例是否有这个属性 setattr(cat, 'name', 'tiger') # same as: a.name = 'tiger'print getattr(cat, 'name') # same as: print a.namegetattr(cat, 'sayHi')() # same as: cat.sayHi()print Cat.__doc__ # Noneprint Cat.__name__ # Catprint Cat.__module__ # __main__print Cat.__bases__ # (<type>,)print Cat.__dict__ # {'__module__': '__main__', ...}</type>print cat.__dict__print cat.__class__print cat.__class__ == Cat # Trueim = cat.sayHiprint im.im_funcprint im.im_self # catprint im.im_class # Catco = cat.sayHi.func_codeprint co.co_names # ('name',)print co.co_varnames # ('self',)im = cat.sayHiif inspect.isroutine(im): im()print inspect.getmro(Cat)#(<class '__main__.Cat'>, <type 'object'>)print Cat.__mro__#(<class '__main__.Cat'>, <type 'object'>)class Dog: passprint inspect.getmro(Dog)#(<class __main__.Dog at 0x...>,)print Dog.__mro__ # AttributeError








