chzhiyi / -KnowledgeShare

6 stars 1 forks source link

20190319 - Python自省 - jingchu #35

Open qingfengmingjian opened 5 years ago

qingfengmingjian commented 5 years ago

Python自省 自省:自我检查的行为,如“三省吾身” 计算机中:自省就是用来检查某些事物确定它是什么,它知道什么以及它能做什么 python中常见的自省机制(函数方法)有dir()、type()、hasattr()、isinstance(), 通过这些函数,我们能在程序运行时得知对象的类型,判断对象(类对象、函数对象、变量)是否存在某个属性/方法/函数,访问对象的属性。

1.联机帮助help()

import datetime
help(datetime)#可看到包里面的代码

2.dir()查找模块以及所有的对象类型的方法、函数、属性,只显示名字,不显示具体代码

import requests
print(dir())#不传参数,它默认查当前文件。
print(dir(requests))

3.doc文档描述:它包含了描述对象的注释:

print(dir.__doc__)
print(help.__doc__)

4.检查Python对象

①对象的名称name

def a():
    print('haha')
b = a
print(b.__name__)
print(a, b)
print(type(b))

②对象的类型type() 最好用isinstance()

print(type(a))
print(type(1))
print(type('a'))
print(isinstance(1, int))

③变量存放的内存空间的地址id()

a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(id(a))
print(id(b))
print(id(c))

print(a is b)
print(c is a)
print(a==b)

④函数对象是否能够被调用callable()

def b():
    pass
print(callable(help))
print(callable(str))
help(callable)

⑤对象的父对象是谁issubclass()

class A:
    pass
class B(A):
    pass
class C(B):
    pass
print(C.__bases__)#查找父类
print(C.__mro__)#寻找MRO路线(继承关系)
print(issubclass(C, A))#比较是不是属于父类

hasattr()/getattr()用来检索属性

print(hasattr(id, '__doct__'))#只能判断是否有此函数或属性
print(getattr(id, '__doc__'))#返回此类对象的属性信息,不进行判断