反射

用户输入一段字符串,执行该字符串对应的方法

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('那个人没写完')
  
原文地址:https://www.cnblogs.com/luodaoqi/p/11528886.html