python的自省机制

8-毛俊杰
8-毛俊杰 发布于 2020-06-22 22:17
阅读量: 1119

文章同步更新于:blog.dalao.icu/archives/34.html,请访问该博客获得更好的阅读体验。

1.什么是自省机制

在编程语言中,自省(introspection)并不是自我反省,而是指自我检查行为。

它的内容包括:

  1. 告诉别人,我是谁

  2. 告诉别人,我能做什么

检查某些事物以确定它是什么,它能做什么,这样,给开发人员带来了极大的灵活性和控制力。

具体的来说,就是OPP(面向对象)语言在程序运行时,能够知道对象的类型,部分语言还能够知道对象所拥有的属性。

自省机制,对很多动态语言(如python)是很重要的机制。

如,python,ruby,object-C, C++等语言都具有自省能力,在这些语言中,C++自省能力最差,只能在运行时得知对象的类型,而python,具有很强的自省能力,不仅能知道运行时对象的类型,还能知道对象所拥有的属性。

2.python中常见的自省机制

在python中,常见的自省(introspection)机制有许多,如:dir()type()hasattr()isinstance()等,通过这些函数,我们可以在运行时得知对象的类型和属性。

 

dir()

dir()函数是python中自省功能特别常用的一种函数,它返回传递给它的任何对象的属性名称经过排序的列表,如果不指定对象,则dir()函数返回当前作用域中的名称。

a = 2333
print(dir(a))
# 输出省略...

type():

type()函数可以帮忙确定对象的类型,比如确定一个对象是字符串还是整数类型,或者是其他对象的类型,它返回类型对象的名称:

print(tpye(42))
# output:<class 'int'>
    
print(type([1, 2]))
# output:<class 'list'>

hasattr()

虽然使用dir()函数会返回一个对象属性的列表,但我们有时候的需求只是判断一个对象是否含有某一个或者多个属性,这样,我们就可以使用hasattr()函数来完成,它返回一个bool值:

import json
print(hasattr(json, "dumps"))

getattr()

使用hasattr()函数判断对象是否有某个属性值后,我们可以配合getattr()函数来获取其属性值:

print(getattr(json, "__path__"))

使用getattr()获取函数后,我们可以很方便的使用这个函数,比如以下的例子,这样我们就可以不用再使用json.dumps来调用这个函数:

dumps = getattr(json, "dumps")
dumps({"name": "dio"})
​
# 或者以下写法
dumps = josn.dumps
dumps({"name": "dio"})

id():

id()函数返回对象的唯一标识符(也就是对象的地址),标识符是一个整数:

a = 23333
print(id(a))

isinstance():

使用isinstance()函数可以确定一个对象是否是某个特定类型或者定制类的实例:

class A:
    pass
​
class B(A):
    pass
​
obj = B()
​
print(isinstance(obj, B)) # true
print(isinstance(obj, A)) # true

只要某对象与继承链上的类型进行比较,均会返回True

 

callable():

使用callable()函数可以确定一个对象是否是可调用对象,比如函数对象,类对象等等,他们都是可调用的对象:

callable("23333") # false
callable(str) # true

 

8-毛俊杰
8-毛俊杰 前源码公社社长兼任编程俱乐部部长,ICPC竞赛铜牌退役狗,专攻算法和机器学习,博客:https://blog.dalao.icu
收藏 转发 评论