Jython的内省服务:更简单的内省方式
创始人
2024-04-15 05:30:38
0

Jython的内省服务

常常需要在运行时确定一个对象的特性。我们称这为内省这个对象。 Java 平台通过 java.lang.Class 类和 java.lang.reflect 包中的类提供了内省服务。这些 API 虽然强大,但是它们不太容易使用。您猜对了,Jython提供了更简单的内省方式。

在 Jython 中,我们可以使用 dir 和vars 函数检查任何对象 ―― 如模块、函数、类、序列、映射等 ―― 的绑定。为了更好地理解它是如何工作的,考虑下面的例子。每一个 print 语句的输出插入了前缀“...”(并重新编排)以方便阅读dir 函数只返回绑定名,而 vars 函数返回名字和值,因此,当两个函数返回同样的名字时,我们只需要使用 vars函数,如下所示:

  1. #-- empty start --  
  2. print "vars:", vars()  
  3. ...vars: {'__doc__': None, '__name__': '__main__'}  
  4.  
  5. x = 1 
  6. y = 2 
  7. z = 3 
  8. l = [x, y, z]  
  9. d = {x:"xxxx", y:"yyyy", z:"zzzz"}  
  10.  
  11. #-- 本地变量 --  
  12. print x, y, z, l, d  
  13. ...1 2 3 [1, 2, 3] {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}  
  14.  
  15. #-- Jython内省:添加本地变量 --  
  16. print "vars:", vars()  
  17. ...vars: {'__name__': '__main__', 'x': 1, \  
  18. ... 'd': {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}, '__doc__': None, \  
  19. ... 'y': 2, 'l': [1, 2, 3], 'z': 3}  
  20.  
  21. import sys  
  22.  
  23. #-- Jython内省:plus import --  
  24. print "vars:", vars()  
  25. ...vars: {'__name__': '__main__', 'z': 3, 'l': [1, 2, 3], \  
  26. ... '__doc__': None, 'y': 2, 'x': 1, 'sys': sys module, \  
  27. ... 'd': {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}}  
  28.  
  29. #-- Jython内省:sys import --  
  30. print "vars sys:", vars(sys)    
  31. ...vars sys: {'classLoader': \  
  32. ...     < beanProperty classLoader type: java.lang.ClassLoader at 31845755>,   
  33. ...     ... many values removed ...,  
  34. ... 'warnoptions': < reflected field public static \  
  35. ...     org.python.core.PyList \  
  36. ...     org.python.core.PySystemState.warnoptions at 1024901>}  
  37.  
  38. del x, y, z  
  39.  
  40. #-- Jython内省:post delete --  
  41. print "vars:", vars()  
  42. ...vars: {'__name__': '__main__', 'l': [1, 2, 3], '__doc__': None, \  
  43. ... 'sys': sys module, 'd': {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}}  
  44.  
  45. def func (x, y):  
  46.     return x, y  
  47.  
  48. class MyClass ():  
  49.     def __init__ (self, x, y):  
  50.         self.__x = x  
  51.         self.__y = y  
  52.  
  53.     def method1 (self):  
  54.         return self.x + self.y  
  55.  
  56.     def method2 (self, x, y):  
  57.         return  self.x + self.y + x + y  
  58.  
  59. #-- Jython内省:plus function and class --  
  60. print "vars:", vars()  
  61. ....vars: {'func': < function func at 21569784>, '__name__': '__main__', \  
  62. ...  'l': [1, 2, 3], '__doc__': None, \  
  63. .... 'MyClass': < class __main__.MyClass at 1279942>, \  
  64. ...  'sys': sys module, 'd': {3: 'zzzz', 2: 'yyyy', 1: 'xxxx'}}  
  65.  
  66. #-- Jython内省:function --  
  67. print "dir: ", dir(func)     # **** dir and vars different here ****  
  68. print "vars:", vars(func)  
  69. ...dir:  ['__dict__', '__doc__', '__name__', 'func_closure', \  
  70. ... 'func_code', 'func_defaults', 'func_doc', 'func_globals', 'func_name']  
  71. ...vars: None 
  72.  
  73. #-- Jython内省:class --  
  74. print "vars:", vars(MyClass)  
  75. ...vars: {'__doc__': None, '__init__': < function __init__ at 17404503>, \  
  76. ... 'method2': < function method2 at 23511968>, '__module__': '__main__', \  
  77. ... 'method1': < function method1 at 28670096>}  
  78.  
  79. myclass = MyClass(1, 2)  
  80.  
  81. #-- Jython内省:instance --  
  82. print "myclass:", myclass  
  83. print "vars:", vars(myclass)  
  84. ...myclass: < __main__.MyClass instance at 19014134>  
  85. ...vars: {'_MyClass__y': 2, '_MyClass__x': 1}  

注意 dir(x) 一般等同于 x.__dict__.keys(),而 vars(x) 一般等同于 x.__dict__。

【编辑推荐】

  1. Jython特殊属性介绍
  2. Jython的继承能力:单继承和多继承
  3. 常用Jython方法介绍:init和del
  4. 介绍Jython类:添加定义类属性及隐藏变量
  5. Jython中的对象——面向对象的语言概述

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...