目录
反射就是通过字符串来操作类或者对象的属性
假如有一个需求,需要根据用户输入的内容来调用类中的方法。可以怎么实现?
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)
这样的确可以完成 不过太过麻烦
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('该命令不存在')
判断一个属性是否在对象中,返回True或者False
class Base:
    pass
class Foo(Base):
    def run(self):
        print('run')
    def speak(self):
        print('speak')
print(hasattr(Foo(),"speak"))
通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法
class Base:
    pass
class Foo(Base):
    def run(self):
        print('run')
    def speak(self):
        print('speak')
        
run=getattr(Foo(),"run")
run()   # 执行
通过字符串来设置属性或方法
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)
通过字符串来删除属性或方法
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__)
反射:通过字符串来获取,设置,删除对象中的属性或方法
原文:https://www.cnblogs.com/XuChengNotes/p/11449011.html