Jython的内省服务
常常需要在运行时确定一个对象的特性。我们称这为内省这个对象。 Java 平台通过 java.lang.Class 类和 java.lang.reflect 包中的类提供了内省服务。这些 API 虽然强大,但是它们不太容易使用。您猜对了,Jython提供了更简单的内省方式。
在 Jython 中,我们可以使用 dir 和vars 函数检查任何对象 ―― 如模块、函数、类、序列、映射等 ―― 的绑定。为了更好地理解它是如何工作的,考虑下面的例子。每一个 print 语句的输出插入了前缀“...”(并重新编排)以方便阅读dir 函数只返回绑定名,而 vars 函数返回名字和值,因此,当两个函数返回同样的名字时,我们只需要使用 vars函数,如下所示:
- #-- empty start --
- print "vars:", vars()
- ...vars: {'__doc__': None, '__name__': '__main__'}
- x = 1
- y = 2
- z = 3
- l = [x, y, z]
- d = {x:"xxxx", y:"yyyy", z:"zzzz"}
- #-- 本地变量 --
- print x, y, z, l, d
- ...1 2 3 [1, 2, 3] {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}
- #-- Jython内省:添加本地变量 --
- print "vars:", vars()
- ...vars: {'__name__': '__main__', 'x': 1, \
- ... 'd': {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}, '__doc__': None, \
- ... 'y': 2, 'l': [1, 2, 3], 'z': 3}
- import sys
- #-- Jython内省:plus import --
- print "vars:", vars()
- ...vars: {'__name__': '__main__', 'z': 3, 'l': [1, 2, 3], \
- ... '__doc__': None, 'y': 2, 'x': 1, 'sys': sys module, \
- ... 'd': {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}}
- #-- Jython内省:sys import --
- print "vars sys:", vars(sys)
- ...vars sys: {'classLoader': \
- ... < beanProperty classLoader type: java.lang.ClassLoader at 31845755>,
- ... ... many values removed ...,
- ... 'warnoptions': < reflected field public static \
- ... org.python.core.PyList \
- ... org.python.core.PySystemState.warnoptions at 1024901>}
- del x, y, z
- #-- Jython内省:post delete --
- print "vars:", vars()
- ...vars: {'__name__': '__main__', 'l': [1, 2, 3], '__doc__': None, \
- ... 'sys': sys module, 'd': {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}}
- def func (x, y):
- return x, y
- class MyClass ():
- def __init__ (self, x, y):
- self.__x = x
- self.__y = y
- def method1 (self):
- return self.x + self.y
- def method2 (self, x, y):
- return self.x + self.y + x + y
- #-- Jython内省:plus function and class --
- print "vars:", vars()
- ....vars: {'func': < function func at 21569784>, '__name__': '__main__', \
- ... 'l': [1, 2, 3], '__doc__': None, \
- .... 'MyClass': < class __main__.MyClass at 1279942>, \
- ... 'sys': sys module, 'd': {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}}
- #-- Jython内省:function --
- print "dir: ", dir(func) # **** dir and vars different here ****
- print "vars:", vars(func)
- ...dir: ['__dict__', '__doc__', '__name__', 'func_closure', \
- ... 'func_code', 'func_defaults', 'func_doc', 'func_globals', 'func_name']
- ...vars: None
- #-- Jython内省:class --
- print "vars:", vars(MyClass)
- ...vars: {'__doc__': None, '__init__': < function __init__ at 17404503>, \
- ... 'method2': < function method2 at 23511968>, '__module__': '__main__', \
- ... 'method1': < function method1 at 28670096>}
- myclass = MyClass(1, 2)
- #-- Jython内省:instance --
- print "myclass:", myclass
- print "vars:", vars(myclass)
- ...myclass: < __main__.MyClass instance at 19014134>
- ...vars: {'_MyClass__y': 2, '_MyClass__x': 1}
注意 dir(x) 一般等同于 x.__dict__.keys(),而 vars(x) 一般等同于 x.__dict__。
【编辑推荐】