内省 (计算机科学)
在计算机科学中,内省是指计算机程序在运行时(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 (页面存档备份,存于互联网档案馆)
🔥 Top keywords: Baike: 首页Special:搜索九龍城寨之圍城胖猫跳江事件Energy (組合)淚之女王背着善宰跑逆天奇案2金智媛习近平郭葦昀金秀賢 (男演員)不夠善良的我們九龍寨城邊佑錫伍允龍春色寄情人劉俊謙 (香港)張書偉怪獸8號虽然不是英雄葉乃文謝坤達神耆小子六四事件我的婆婆怎麼那麼可愛排球少年!!角色列表唐振剛2024年湯姆斯盃Seventeen (組合)蕭景鴻排球少年!!WIND BREAKER—防風少年—安東尼·愛德華茲 (籃球運動員)ILLIT中华人民共和国中華民國BABYMONSTER與鳳行張文傑BOYNEXTDOOR彭丽媛笑看風雲日本母亲节习明泽金惠奫徐巧芯從Lv2開始開外掛的前勇者候補過著悠哉異世界生活德雷克 (歌手)搜查班長1958支配物种乘風2024張員瑛承欢记嚴爵香港梅龍高速公路塌陷事故柯建銘葬送的芙莉蓮迷宮飯轉生貴族憑鑑定技能扭轉人生~繼承弱小領土後,招募優秀人才打造最強領土~为人民服务 (2022年电影)黃道十二宮IVE (組合)草榴社区歐倩怡沒有秘密周雨彤柯佳嬿無職轉生~到了異世界就拿出真本事~謝京穎埃马纽埃尔·马克龙破墓周處除三害 (電影)許瑋甯Twitter五月天打天下2逆天奇案李主儐大谷翔平家族榮耀之繼承者胡子彤郭晉安毛泽东Baike: 分類索引沈伯洋白紙運動文化大革命城市猎人 (2024年电影)2024年花蓮地震(G)I-DLE城市猎人朴成焄郭宁宁2024年優霸盃哥吉拉-1.0汤姆斯杯