内省 (计算机科学)
在计算机科学中,内省是指计算机程序在运行时(Runtime)检查对象(Object)类型的一种能力,通常也可以称作“运行时类型检查"。一些编程语言如C++、Java、Ruby、PHP、Objective-C、Perl等等具有这种特性。
不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序在运行时(Runtime)可以访问、检测和修改它本身状态或行为的一种能力。一些编程语言比如Java具有反射特性,而C++不具有反射特性只具有内省特性。
例子
C++
C++通过执行期类型消息(RTTI)的typeid
和dynamic_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']
还可以使用内置函数type
和isinstance
来确定一个对象是什么,用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]。
参见
引用
- ^ Java Language Specification: instanceof. [2020-09-27]. (原始内容存档于2012-02-13).
- ^ Java API: java.lang.Class. [2020-09-27]. (原始内容存档于2009-09-11).
- ^ Unifying types and classes in Python 2.2. [2020-09-27]. (原始内容存档于2020-11-30).
外部链接
- Introspection (页面存档备份,存于互联网档案馆) on Rosetta Code (页面存档备份,存于互联网档案馆)