Python 反射
在面向对象编程中,反射指的是提取正在使用的任何对象的信息的能力。您可以了解对象的类型,它是否是任何其他类的子类,它的属性等等。Python的标准库提供了许多反射对象不同属性的函数。反射有时也被称为内省。
让我们来回顾一下反射函数。
type() 函数
我们已经多次使用过这个函数。它告诉您一个对象属于哪个类。
示例
以下语句打印不同内置数据类型对象的各自的类。
在这里,你将得到以下 输出 −
让我们验证一个用户定义类的对象的类型 –
它将产生以下输出
isinstance()函数
这是Python中的另一个内置函数,用于确定一个对象是否是给定类的实例
语法
这个函数始终返回一个布尔值,如果对象确实属于给定的类,则返回true;如果不属于,则返回false。
示例
以下语句返回True –
相比之下,这些陈述会打印出 False。
它将产生以下 输出 –
你还可以使用用户定义的类来进行检查
将产生以下 输出 −
在Python中,甚至类也是对象。所有的类都是object类的对象。可以通过以下代码验证:
上面的所有打印语句都打印True。
issubclass()函数
这个函数检查一个类是否是另一个类的子类。适用于类,而不是它们的实例。
如前所述,所有Python类都是从object类继承的子类。因此,下面的打印语句对所有类都返回True。
将产生以下的 输出 –
callable() 函数
如果一个对象可以调用并执行某个过程,则它被称为可调用对象。Python 中的函数是可调用对象,它们执行某个特定的过程。因此调用 callable(function) 返回 True。任何函数,无论是内置的还是用户定义的,或者是方法,都是可调用的。内置数据类型的对象,比如 int、str 等,是不可调用的。
示例
字符串对象是不可调用的。但是abs是一个可调用的函数。list的pop方法是可调用的,但clear()实际上是调用函数而不是函数对象,因此不可调用。
它将会产生以下输出 −
如果一个类实例具有__call__()
方法,则可调用该实例。在下面的示例中,test类包括__call__()
方法。因此,它的对象可以被用作调用函数。因此,具有__call__()
函数的类的对象是可调用的。
这将产生以下 输出 −
getattr()函数
getattr()内置函数用于获取对象的指定属性的值。
示例
这将产生以下 输出 −
setattr()函数
setattr()内置函数向对象添加一个新的属性并赋予它一个值。它还可以改变现有属性的值。
在下面的示例中,test类的对象具有一个名为name的属性。我们使用setattr函数添加age属性并修改name属性的值。
它将产生以下的输出−
hasattr()函数
这个内置函数返回True,如果给定的属性可以访问对象参数,返回False,如果不能访问。我们使用相同的测试类,检查它是否具有某个属性。
这将产生以下 输出 –
dir()函数
如果没有提供参数调用该内置函数,则返回当前作用域中的名称。对于任何对象作为参数,它将返回给定对象的属性列表,以及可以从该对象到达的属性。
- 对于模块对象 − 该函数返回模块的属性。
-
对于类对象 − 该函数返回其属性,并递归返回其基类的属性。
-
对于任何其他对象 − 它的属性,它的类的属性,以及递归返回其类的基类的属性。
示例
它将产生以下 输出 −
例子
它将产生以下 输出 −
例子
它会生成以下的 输出 −