内省 (计算机科学)

计算机科学中,内省是指计算机程序运行时Runtime)检查对象Object)类型的一种能力,通常也可以称作“运行时类型检查"。一些编程语言C++JavaRubyPHPObjective-CPerl等等具有这种特性。

不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序运行时Runtime)可以访问、检测和修改它本身状态或行为的一种能力。一些编程语言比如Java具有反射特性,而C++不具有反射特性只具有内省特性。

例子

C++

C++通过执行期型态讯息(RTTI)的typeiddynamic_cast关键字支持类型内省。dynamic_cast的例子:

Person* p = dynamic_cast<Person *>(obj);
if (p != nullptr) {
  p->walk();
}

typeid的例子:

if (typeid(Person) == typeid(*obj)) {
  serialize_person( obj );
}

Java

Java中最简单的类型自省的例子是instanceof算符[1]。例如:

if (obj instanceof Person) {
    Person p = (Person)obj;
    p.walk();
}

java.lang.Class类是更高级自省的基础[2]。例如:

System.out.println(obj.getClass().getName());

Python

Python中最常用的自省的方法是dir函数,它详细的列出一个对象的特性。例如:

>>> class Foo:
...     def __init__(self, val):
...         self.x = val
... 
>>>     def bar(self):
...         return self.x
...
>>> dir(Foo(5))
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__str__', '__weakref__', 'bar', 'x']

还可以使用内建函数typeisinstance来确定一个对象是什么,用hasattr确定一个对象做什么。例如:

>>> a = Foo(10)
>>> b = Bar(11)
>>> type(a)
<type 'Foo'>
>>> isinstance(a, Foo)
True
>>> isinstance(a, type(a))
True
>>> isinstance(a, type(b))
False
>>> hasattr(a, 'bar')
True

在Python 2而非Python 3中,声明class Foo而非class Foo(object)将导致type返回通用的instance类型而非这个类[3]

参见

引用

  1. ^ Java Language Specification: instanceof. [2020-09-27]. (原始内容存档于2012-02-13). 
  2. ^ Java API: java.lang.Class. [2020-09-27]. (原始内容存档于2009-09-11). 
  3. ^ Unifying types and classes in Python 2.2. [2020-09-27]. (原始内容存档于2020-11-30). 

外部链接