用户输入一段字符串,执行该字符串对应的方法
hasattr():判断一个属性是否在对象中,返回True或者False
getattr():通过字符串获取属性或者方法,如果获取收到了,就会返回相应的属性和方法
setattr():通过字符串来设置属性或方法
delattr():通过字符串来删除属性或方法
class Foo:
def run(self):
print('run')
def speak(self):
print('speak')
p = Foo()
print(Foo.__dict__)
cmd = input('请输入命令')
方案一
print(Foo.__dict__[cmd])
Foo.__dict__[cmd](p)
if hasattr(p,cmd):
run = getattr(p,cmd)
run()
else:
print('该命令不存在')
通过用户输入key和value往对象中赋值
key = input('请输入key:')
value = input('请输入value')
setattr(p,key,value)
print(p.age)
动态的往对象中放方法
def test(a):
print(a)
print(p.__dict__)
setattr(p,'test',test)
print(p.__dict__)
p.test(0)
动态的删除属性
原始的删除方法
p.name = 'lqz'
print(p.__dict__)
del p.name
print(p.__dict__)
动态删除p中属性为变量a的属性
p.name = 'lqz'
p.age = 18
p.sex = 'male'
a = input('请输入要删除的属性:')
print(p.__dict__)
delattr(p,a)
print(p.__dict__)
直接p.a是不对的
del p.a
删除对象中属性为name 字符串的属性
判断一下对象中有没有我输入的属性,如果有打印
p.name = 'lqz'
p.age = 19
p.sex = 'male'
cmd = input('请输入要查询的属性:')
if hasattr(p,cmd)
a = getattr(p,cmd)
else:
print('该属性不存在')
反射:通过字符串来获取,设置,删除对象中的属性或方法
例子
class BlackMedium:
featrue = '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(b1__dict__)
print(hasattr(b1,'sell_house'))
a = 'sell_house'
getattr(b1,'sell_house')
getattr(b1,a)()
sell_house = getattr(b1,a)
name = getattr(b1,'name')
print(name)
print(sell_house)
删除属性或方法
delattr(b1,'xxx')
print(b1.__dict__)
delattr(b1,'name')
print(b1.__dict__)
模块也是对象,也可以用四个方法
import os
print(hasattr(os.'path1'))
使用自己写的模块,通过反射来获取模块中是否有我要使用的属性或方法,如果有就执行,没有就报错
import utils
utils.speak()
if hasattr(utils,'speak'):
speak = getattr(utils,'speak')
speak()
还有就是我以为模块中写完了其实没写完,去判断是否存在
utils.eat()
if hasattr(utils,'eat'):
eat = getattr(utils,'eat')
eat()
else:
print('那个人没写完')