isinstance() #isinstance(obj,cls)检查obj是否是cls的对象
issubclass() #issubclass(sub.super)检查sub是不是super的子类
反射:用字符串类型的名字去操作变量hasattr,getattr,setattr,delattr
eval有安全隐患
##############################################
class A:
price = 20
def func(self):
print('in func')
a = A()
a.name = 'alex'
ret = getattr(a,'name') #反射对象的属性
ret1 = getattr(a,'func') #反射对象的方法
ret1()
ret2 = getattr(A,'price') #反射类的属性
if hasattr(A,'func'):
getattr(A,'func')() #反射类的方法,需要classmethod或staticmethod
反射模块和内置模块中的属性方法同理
#################################################
def qqxing():
print('qqxing')
year = 2018
import sys
print(sys.modules['main'].year)
print(getattr(sys.modules['__main__'],'year')) #反射自己模块中的变量
print(getattr(sys.modules['__main__'],'qqxing')) #反射自己模块中的函数
考虑到模块被调用,应该用__name__
##################################################
setattr #设置修改变量
setattr(a,'name','alex') #添加或修改
delattr #删除变量
delattr(a,'name') #删除name变量