反射

一、什么是反射

反射就是通过字符串来操作类或者对象的属性

  • 反射本质就是在使用内置函数,其中反射有以下四个内置函数:
    1. hasattr(object,name):判断一个属性是否在对象中,返回True或者False
    2. getattr(object, name, default=None):通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法
    3. setattr(object, key, value):通过字符串来设置属性或方法
    4. delattr(object, name):通过字符串来删除属性或方法

二、反射的应用

假如有一个需求,需要根据用户输入的内容来调用类中的方法。可以怎么实现?

class Base:
    pass
class Foo(Base):
    def run(self):
        print('run')
    def speak(self):
        print('speak')
        
cmd=input('请输入命令:')
print(Foo.__dict__[cmd])
p = Foo()
Foo.__dict__[cmd](p)

这样的确可以完成 不过太过麻烦

2.1 使用反射

class Base:
    pass
class Foo(Base):
    def run(self):
        print('run')
    def speak(self):
        print('speak')

cmd=input('请输入命令:')
p = Foo()
if hasattr(p,cmd):	# 查看对象中是否由这个属性
    run=getattr(p,cmd)	# 获取对象中的属性
    run()	# 执行
else:
    print('该命令不存在')

hasattr(object,name)

判断一个属性是否在对象中,返回True或者False

class Base:
    pass
class Foo(Base):
    def run(self):
        print('run')
    def speak(self):
        print('speak')
print(hasattr(Foo(),"speak"))

getattr(object, name, default=None)

通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法

class Base:
    pass
class Foo(Base):
    def run(self):
        print('run')
    def speak(self):
        print('speak')
        
run=getattr(Foo(),"run")
run()	# 执行

setattr(object, key, value)

通过字符串来设置属性或方法

class Base:
    pass
class Foo(Base):
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p = Foo()
key=input('请输入key:')
value=input('输入value:')
setattr(p,key,value)	# 设置属性
age = getattr(p,key)
print(age)

def test(a):
    print(a)
setattr(p,'test',test)	# 设置方法
p.test(0)

delattr(object, name)

通过字符串来删除属性或方法

class Base:
    pass
class Foo(Base):
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p = Foo()
p.name='xc'
p.age=18
p.sex='male'
a=input('请输入要删除的属性:')
print(p.__dict__)	
delattr(p,a)	# 删除属性
print(p.__dict__)

小结

反射:通过字符串来获取,设置,删除对象中的属性或方法

posted @ 2019-09-02 21:03  正在学习的Barry  阅读(148)  评论(0编辑  收藏  举报
-->