类型内省

在计算机科学中，类型内省（），是指计算机程序在运行时（）检查对象（）的类型或属性的一种能力，通常也可以称作“运行时类型检查"。一些编程语言如C++、Java、Ruby、PHP、Objective-C、Perl等等具有这种特性。

不应该将内省和反射混淆。相对于内省，反射更进一步，是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。一些编程语言比如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算符。例如：
if (obj instanceof Person) {
    Person p = (Person)obj;
    p.walk();
}

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

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类型而非这个类。

 参见 
 实化

 引用 

外部链接
Introspection  on Rosetta Code 

Category:面向对象的程序设计