在计算机科学中,类型内省(),是指计算机程序在运行时()检查对象()的类型或属性的一种能力,通常也可以称作“运行时类型检查"。一些编程语言如C++、Java、Ruby、PHP、Objective-C、Perl等等具有这种特性。
不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。一些编程语言比如Java具有反射特性,而C++不具有反射特性只具有内省特性。
例子
C++
C++通过執行期型態訊息(RTTI)的typeid和dynamic_cast关键字支持类型内省。dynamic_cast的例子:
Person* p = dynamic_cast(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)
>> 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类型而非这个类。
参见
- 实化
引用
外部链接
*[http://rosettacode.org/wiki/Introspection Introspection] on [http://rosettacode.org/ Rosetta Code]
评论 (0)