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

简介: 从基本概念,简单例子才能慢慢走到高级一点的地方。 另外,PYTHON的函数式编程也是我很感兴趣的一点。 总体而言,我觉得OOP可以作大的框架和思路,FP能作细节实现时的优雅牛X。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~“自省”应该是原本的概念,特指在运行时获得object自身信息,这一能力“反射”是自省的一种实现方式,是具体的。

 

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

另外,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

 

目录
相关文章
|
1天前
|
Python
Python 练习实例36
Python 练习实例36
|
1天前
|
Python
Python 练习实例35
Python 练习实例35
|
1天前
|
Python
Python 练习实例34
Python 练习实例34
|
2天前
|
Python
Python 练习实例33
Python 练习实例33
|
2天前
|
Python
Python 练习实例32
Python 练习实例32
|
2天前
|
Python
Python 练习实例31
Python 练习实例31
|
3天前
|
Python
Python 练习实例30
Python 练习实例30
|
3天前
|
Python
Python 练习实例29
Python 练习实例29
|
3天前
|
Python
Python 练习实例28
Python 练习实例28
|
4天前
|
安全 Python
深入浅出Python反射机制
1. 什么是反射 简单来说,反射就是程序在运行时能够"观察"自己,获取、检查和修改自身状态或行为的一种能力。听起来有点抽象?别急,我们慢慢道来。 在Python中,反射允许我们在代码运行时: • 查看对象有哪些属性和方法 • 获取属性的值 • 调用对象的方法 • 甚至动态地添加或修改属性和方法