关于PYTHON的反射,装饰的练习

 

从基本概念,简单例子才能慢慢走到高级一点的地方。

另外,PYTHON的函数式编程也是我很感兴趣的一点。

总体而言,我觉得OOP可以作大的框架和思路,FP能作细节实现时的优雅牛X。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
“自省”应该是原本的概念,特指在运行时获得object自身信息,这一能力
“反射”是自省的一种实现方式,是具体的。
自省是“道”,反射是“术”。

好比“变量作用域”是一种概念,而“闭包”是作用域中的一种特定技术。

一种语言可以有完整的自省能力而没有“反射”,也可以有完整的作用域功能而没有“闭包”

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

import time

def 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-8
import sys #  模块,sys指向这个模块对象
import inspect
def 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.name

getattr(cat, 'sayHi')() # same as: cat.sayHi()

print Cat.__doc__           # None
print Cat.__name__          # Cat
print Cat.__module__        # __main__
print Cat.__bases__         # (<type>,)
print Cat.__dict__          # {'__module__': '__main__', ...}</type>

print cat.__dict__
print cat.__class__
print cat.__class__ == Cat # True

im = cat.sayHi
print im.im_func
print im.im_self # cat
print im.im_class # Cat

co = cat.sayHi.func_code
print co.co_argcount        # 1
print co.co_names           # ('name',)
print co.co_varnames        # ('self',)
print co.co_flags & 0b100   # 0

im = cat.sayHi
if inspect.isroutine(im):
    im()

print inspect.getmro(Cat)
#(<class '__main__.Cat'>, <type 'object'>)
print Cat.__mro__
#(<class '__main__.Cat'>, <type 'object'>)
class Dog: pass
print inspect.getmro(Dog)
#(<class __main__.Dog at 0x...>,)
print Dog.__mro__ # AttributeError

 

时间: 2024-11-02 01:08:22

关于PYTHON的反射,装饰的练习的相关文章

Python中的装饰器用法详解_python

本文实例讲述了Python中的装饰器用法.分享给大家供大家参考.具体分析如下: 这里还是先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: 复制代码 代码如下: @makebold @makeitalic def say():    return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出的答案是: 复制代码 代码如下: def makebold(fn):    

Python中的装饰器用法详解

来源:http://www.jb51.net/article/59867.htm 来源:http://blog.csdn.net/mdl13412/article/details/22608283 这篇文章主要介绍了Python中的装饰器用法,以实例形式详细的分析了Python中的装饰器的使用技巧及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了Python中的装饰器用法.分享给大家供大家参考.具体分析如下: 这里还是先由stackoverflow上面的一个问题引起吧,如

介绍Python的@property装饰器的用法

  这篇文章主要介绍了介绍Python的@property装饰器的用法,是Python学习进阶中的重要知识,代码基于Python2.x版本,需要的朋友可以参考下 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: ? 1 2 s = Student() s.score = 9999 这显然不合逻辑.为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score

Python深入05 装饰器

原文:Python深入05 装饰器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 装饰器最早在Python 2.

详解Python中的装饰器、闭包和functools的教程_python

装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以使用装饰器模式.简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式.通过这个在Python2.6版本中被新加入的特性可以用来实现装饰器设计模式. 顺便提一句,在继续阅读之前,如果你对Python中的闭包(Closure)概念不清楚,请查看本文结尾后的附录,如果没有闭包的相关概念,很难恰当的理解P

python中反射用法实例_python

本文实例讲述了python中反射用法.分享给大家供大家参考.具体如下: import sys, types,new def _get_mod(modulePath): try: aMod = sys.modules[modulePath] if not isinstance(aMod, types.ModuleType): raise KeyError except KeyError: # The last [''] is very important! aMod = __import__(mo

python @age.setter 装饰器 怎么用p.age=1调用不了

问题描述 python @age.setter 装饰器 怎么用p.age=1调用不了 #源码: class Person: def init(self,name,age): print('gouzao') self.__name=name self.__age=age @property def age(self): print('thisis get') return self.__age @age.setter def age(self,value): print('jinlaileme')

理解Python中的装饰器

文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出的答案是: def makebold(fn): def wrapped(): return "<b>" + fn() + "</b>&q

python闭包以及装饰器

通俗的定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).它只不过是个"内层"的函数,由一个名字(变量)来指代,而这个名字(变量)对于"外层"包含它的函数而言,是本地变量; 1 #示例一: 2 #!/usr/bin/python 3 #encoding=utf-8 4 5 def add_a(num1): 6 print "num1:%d" % num1 7 def add