反射

反射在面向对象中是很重要的

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,再加上()执行就出来了。

 

 

 

 




posted @ 2018-11-20 13:13  小菜鸟111  阅读(149)  评论(0编辑  收藏  举报