反射

# 反射主要是程序可以访问,监测和修改它本身状态或行为的一种能力(自省)。
# 四个可以实现自省的函数
# hasattr(object,name) 判断object中有没有一个name字符串对应的方法或者属性
#getattr(obj, attr,default = None):
# 调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为'bar',则返回obj.bar。
# 没有的话就返回默认值
# setattr(obj, attr, val):
# 调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为'bar',
# 则相当于obj.bar = val。
# delattr(obj,attr) #del obj.attr
# 四个方法的演示
class BlackMedium:
    feature = "Ugly"
    def __init__(self,name,addr):
        self.name = name
        self.addr = addr
    def sell_house(self):
        print("%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不是傻逼" % self.name)
    def rent_house(self):
        print("%s 黑中介租房子啦,傻逼才租呢" %self.name)

b1 = BlackMedium("中介","房子")

# 监测是否含有某属性
# 可以是数据属性,也可以是函数属性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))

# 获取属性
n = getattr(b1,'name')
func = getattr(b1,'rent_house')
print(n)
func()
# getattr(b1,'age') # 出错
# 要设置默认属性,这样没有的时候才不会报错
print(getattr(b1,'age','没有这个属性'))

# 设置属性
setattr(b1,'gender','male')
print(b1.gender)
setattr(b1,'show_name',lambda self:self.name + 'sb')
print(b1.__dict__)
print(BlackMedium.__dict__)
print(b1.show_name(b1)) # 不会自动传入参数,需手动

# 删除属性
delattr(b1,'addr')
delattr(b1,'show_name')
# 此时已经没有了show_name属性,所以会报错
# delattr(b1,'show_name')
print(b1.__dict__)

# 类也是对象
class Foo(object):
    staticField = 'old boy'
    def __init__(self):
        self.name = 'wang'
    def func(self):
        return 'func'
    @staticmethod
    def bar():
        return 'bar'
print(getattr(Foo,'staticField'))
print(getattr(Foo,'func'))
print(getattr(Foo,'bar'))

import sys
def s1():
    print('s1')
def s2():
    print('s2')
this_module = sys.modules[__name__]
print(hasattr(this_module,'s1'))
print(getattr(this_module,'s2'))
print(this_module)
# 也可以用反射来查找某个模块是否存在某个方法
原文地址:https://www.cnblogs.com/cong12586/p/11371694.html