內省 (電腦科學)

電腦科學中,內省是指電腦程式執行時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). 

外部連結