反射

一、什么是反射??
  在面向对象的思想中,把对象能够访问、查询、修改自身的状态或行为称为“反射”。

二、python中的反射
  Python思想:一切事物皆为对象。

  在python中,可以通过字符串的的形式来操作对象的属性。这种行为称之为python中的反射。

三、python实现反射(自省)的手段:
  通过4个内置函数来实现:hasattr(object,name)      getattr(object,name,default=None)   setattr(x,y,v)   delattr(x,y)

hasattr(object,name)
复制代码
#判断object中有没有一个name字符串对应的方法或属性
存在返回True,不存在返回False

class BlackMedium:
    feture = 'Ugly'

    def __init__(self,name,addr):
        self.name=name
        self.addr=addr

    def sell_hourse(self):
        print('【%s】正在买房子,'%self.name)

    def rent_hourse(self):
        print('【%s】正在组房子,'%self.name)

b1=BlackMedium('W祝愿','zu')
#b1.name  --->b1.__dict__['name']
#找的是b1里
print(hasattr(b1,'addr'))


getattr(object,name,default=None)
复制代码
class BlackMedium:
    feture = 'Ugly'

    def __init__(self,name,addr):
        self.name=name
        self.addr=addr

    def sell_hourse(self):
        print('【%s】正在买房子,'%self.name)

    def rent_hourse(self):
        print('【%s】正在组房子,'%self.name)

print(getattr(b1,'name'))
print(getattr(b1,'rent_hourse'))
print(getattr(b1,'rent_hourdfghfse','没有这事'))#没有就报错.  加默认参数ok
#找到函数地址直接加括号运行
func=getattr(b1,'rent_hourse')
func()
#也可以为实例增加修改内容
setattr(b1,'sb',True)
setattr(b1,'sb1','gvxdvx')
print(b1.__dict__)



delattr(x,y)
复制代码
def delattr(x, y): # real signature unknown; restored from __doc__
    """
    Deletes the named attribute from the given object.

    delattr(x, 'y') is equivalent to ``del x.y''
    """
    pass
delattr(b1,'sb')
print(b1.__dict__)
注意:不仅仅是实例对象才能使用反射,类本身也是对象,所以类也可以用反射,即类也可以作为object参数参入到上述四个函数中去。例如:

复制代码
class Foo(object):
 
    staticField = "old boy"
 
    def __init__(self):
        self.name = 'wupeiqi'
 
    def func(self):
        return 'func'
 
    @staticmethod
    def bar():
        return 'bar'
 
print getattr(Foo, 'staticField')
print getattr(Foo, 'func')
print getattr(Foo, 'bar')

类也是对象
复制代码
再如,文件再python中也被看作是对象,所以一个文件也能用上述四种方法来操作。

 

复制代码
#新建一个a.py文件,该文件下定义两个变量x和y
x=111                
y=222                
import sys           
obj1=sys.modules[__name__]#__name__当前程序所在的模块的名称
print(hasattr(obj1,'z')) #如果能找到名为x的属性,返回True,这里返回的是True

 

posted @ 2019-09-17 11:14  汉魂县令  阅读(92)  评论(0编辑  收藏  举报