fbpx
维基百科

内省 (计算机科学)

计算机科学中,内省是指计算机程序运行时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). 

外部链接 编辑

内省, 计算机科学, 在计算机科学中, 内省是指计算机程序在运行时, runtime, 检查对象, object, 类型的一种能力, 通常也可以称作, 运行时类型检查, 一些编程语言如c, java, ruby, objective, perl等等具有这种特性, 不应该将内省和反射混淆, 相对于内省, 反射更进一步, 是指计算机程序在运行时, runtime, 可以访问, 检测和修改它本身状态或行为的一种能力, 一些编程语言比如java具有反射特性, 而c, 不具有反射特性只具有内省特性, 目录, 例子, java. 在计算机科学中 内省是指计算机程序在运行时 Runtime 检查对象 Object 类型的一种能力 通常也可以称作 运行时类型检查 一些编程语言如C Java Ruby PHP Objective C Perl等等具有这种特性 不应该将内省和反射混淆 相对于内省 反射更进一步 是指计算机程序在运行时 Runtime 可以访问 检测和修改它本身状态或行为的一种能力 一些编程语言比如Java具有反射特性 而C 不具有反射特性只具有内省特性 目录 1 例子 1 1 C 1 2 Java 1 3 Python 2 参见 3 引用 4 外部链接例子 编辑C 编辑 C 通过執行期型態訊息 RTTI 的typeid和dynamic cast关键字支持类型内省 dynamic cast的例子 Person p dynamic cast lt Person gt obj if p nullptr p gt 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函数 它详细的列出一个对象的特性 例如 gt gt gt class Foo def init self val self x val gt gt gt def bar self return self x gt gt gt dir Foo 5 class delattr dict doc getattribute hash init module new reduce reduce ex repr setattr str weakref bar x 还可以使用内建函数type和isinstance来确定一个对象是什么 用hasattr确定一个对象做什么 例如 gt gt gt a Foo 10 gt gt gt b Bar 11 gt gt gt type a lt type Foo gt gt gt gt isinstance a Foo True gt gt gt isinstance a type a True gt gt gt isinstance a type b False gt gt gt 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 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title 内省 计算机科学 amp oldid 64291300, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。