內省 (電腦科學)
在電腦科學中,內省是指電腦程式在執行時(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 (頁面存檔備份,存於互聯網檔案館)