目录
- 一、什么是反射
- 二、反射的应用
- 2.1 使用反射
- hasattr(object,name)
- getattr(object, name, default=None)
- setattr(object, key, value)
- delattr(object, name)
- 小结
- 2.1 使用反射
一、什么是反射
反射就是通过字符串来操作类或者对象的属性
- 反射本质就是在使用内置函数,其中反射有以下四个内置函数:
- hasattr(object,name):判断一个属性是否在对象中,返回True或者False
- getattr(object, name, default=None):通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法
- setattr(object, key, value):通过字符串来设置属性或方法
- 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__)
小结
反射:通过字符串来获取,设置,删除对象中的属性或方法