维基百科
内省 (计算机科学)
在计算机科学中,内省是指计算机程序在运行时(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]。