反射
反射在面向对象中是很重要的
isinstance它判断的是obj是否是此类或者此类的子孙类实例化出来的对象。
class A: pass class B(A): pass obj = B() print(isinstance(obj, B)) #True print(isinstance(obj, A)) #True # isinstance 它判断的是obj是否是此类或者此类的子孙类实例化出来的对象。
# issubclass 判断B是否是A的子类或者孙类。
class C: pass class A(C): pass class B(A): pass abj = B() print(issubclass(B, A)) #True print(issubclass(B, C)) #True # issubclass 判断B是否是A的子类或者孙类。
# 反射!
# hasattr() *** #判断对象里面是否有这个属性
# getattr() *** #从对象里面拿出这个属性
# setattr() * #在对象里面设置这个属性
# delattr() * #在对象里面删除这个属性
# 反射就是:通过 字符串 去操作对象(实例化对象 类, 模块)。
# 对实例化对象的示例
class A: def __init__(self, name, age): self.name = name self.age = age obj = A('脸哥', 27) ret = getattr(obj,'name') #getattr取出来 print(ret) #取出脸哥 # ret1 = getattr(obj,'name1',None) # print(ret1) #None print(hasattr(obj,'age')) #True
# 用法: if hasattr(obj,'name'): ret = getattr(obj,'name') # 让ret=返回的结果,然后往下你想怎么做再怎么做
# setattr # 设置 setattr(obj,'sex','男') print(getattr(obj,'sex')) # 男 # delattr # 删除 print(obj.__dict__) # 打印全部 delattr(obj,'name') # 删除obj对象里面的name print(obj.__dict__) #没有name了
对类的示例
class A: name = 'alex' def __init__(self): pass def func(self): print('In func') print(getattr(A,'name')) #取name :alex ret = getattr(A,'func') print(ret) ##内存地址 ret(1) #是内存地址,加()就能执行 1是参数,用于传给self
class Manager: def login(self): print(666) getattr(Manager(),'login')() #和下面一样:这个是对象的,后面可以不加参数(常用) getattr(Manager, 'login')(1) #这个是类的,后面要加个参数,虽然这个参数没有什么用,但也要传
作用:
# 需求:执行以下func方法,通过你输入的内容
class A: name = 'alex' def __init__(self): pass def func(self): print('In func') ret = input('>>>') f1 = getattr(A,ret)(1) #输入func,值是In func 1是函数的传参
对其他模块的示例:
已知fs.py文件内容如下:
n1 = '二狗'
def func():
print(666)
class A:
name = 'alex'
def func2(self):
print('------In func2')
取出n1,取出func,取出A类对应的name中的‘alex’,取出A类中的func2
# 用其他模块需要使用import fs
取出n1
import fs print(getattr(fs, 'n1')) # 取出n1中的二狗
取出func
ret = getattr(fs, 'func') ret() # 取出来了func的内容666
取出A类对应的name中的‘alex’
# 方法一 clas = getattr(fs, 'A') # print(clas) # 取出A类<class 'fs.A'> print(clas.name) # 取出A类的name # 方法二: print(getattr(fs.A, 'name'))
取出A类中的func2
getattr(fs.A, 'func2')(1) # 取出A类的func2 后面的1是手动传的,因为这个是类调用这个方法,所以说你要传一个参数给self,虽然这个参数没有什么用,但是你也得手动传进去一个。 --------IN FUNC2
对当前模块(文件)的示例:
import sys # print(sys.modules) # print(sys.modules[__name__]) def func(): print('in func') import sys # print(sys.modules) # print(sys.modules[__name__]) current_module = sys.modules[__name__] getattr(current_module, 'func')() #current_module就是指的当前模块 再取出func,再加上()执行就出来了。
作者:wangkaiok —— 小菜鸟111
出处:http://www.cnblogs.com/wangkaiok/
本文版权归作者和博客园共有,但未经作者同意禁止转载,转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。