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变量