#Author:'haijing'
#date:2018/10/28
# 在python中反射的执行效率还是很高的 反射:通过字符串的形式去操作对象中的成员
#---------getattr(a,'b')方法 从a这个地方拿出b,其中b必须是字符串----------#
# class Foo:
# def __init__(self,name,age):
# self.name = name
# self.age = age
# def show(self):
# return '%s-%s' %(self.name,self.age) #%s为占位符
#
# obj = Foo('haijing',18)
# v1 = obj.name #name是一个变量名 以变量的形式去拿obj中name的值
# print(v1) #打印haijing
#
# v2 = getattr(obj,'name') #以字符串的形式去obj中拿name的值
# print(v2) #打印haijing
#
# func = getattr(obj,'show') #以字符串的形式去拿类中的show()方法 此时func就是show()方法
# r = func() #实际上是去执行show()函数
# print(r) #打印haijing-18
#-------hasattr(a,'b')方法 从a这个地方去检测有没有b,其中b必须是字符串 如果在a中有a则返回True-------#
#---------setattr(a,'b','c') 向对象a中添加成员 a.b = c----------#
#---------delattr(a,'b',) 删除对象a中添加成员成员b----------#
# class Foo:
# def __init__(self,name,age):
# self.name = name
# self.age = age
# def show(self):
# return '%s-%s' %(self.name,self.age) #%s为占位符
#
# obj = Foo('haijing',18)
# print(hasattr(obj,'name')) #打印True
#
# setattr(obj,'k1','v1') #设置self.k1 = v1 存储在内存中
# print(obj.k1) #打印v1
#
# delattr(obj,'name') #删除obj中的name变量
# # obj.name #此时在这一句就会报错
#---------通过类(Foo)+字符串去操作对象中的成员,Foo也是类type的对象----------#
class Foo:
stat = '123' #静态字段
def __init__(self,name,age):
self.name = name
self.age = age
#以前是这样去拿静态字段的值
obj = Foo('haijing',18)
print(obj.stat)
#现在是这样去拿静态字段的值
r = getattr(Foo,'stat') #通过字符串去操作对象中的成员,Foo也是type的对象啊
print(r)
#---------不同py文件之间的字符串去操作对象中的成员----------#
reflection02.py中的内容为:
name = 'haijing'
def func():
return 'func'
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
#reflection01中的内容为:
# import reflection02
# r1 = getattr(reflection02,'name') #执行reflection02.py中的name='haijing'
# print(r1) #打印haijing
# r2 = getattr(reflection02,'func') #执行reflection02.py中的func()函数
# print(r2()) #打印func
# cls = getattr(reflection02,'Foo') #cls就等于reflection02.py中的Foo类
# obj = cls('haijing',18) #obj就相当于reflection02.py中的Foo类的对象
# print(obj.name)
#---------------反射的小应用--------------#
s2.py中的内容:
#Author:'haijing'
#date:2018/10/28
def f1():
return '首页'
def f2():
return '新闻'
def f3():
return '精华'
s1.py中的内容:
#以前 较麻烦
#import s2
# inp = input('请输入要查看的URL:')
# if inp == 'f1':
# s2.f1()
# elif inp == 'f2':
# s2.f2()
# elif inp == 'f3':
# s2.f3()
#现在 用反射改进
import s2
inp = input('请输入要查看的URL:')
if hasattr(s2,inp): #判断用户输入的是否在s2.py模块中有或没有,若有执行func,否则执行else
func = getattr(s2, inp) # inp本身就是字符串
result = func()
print(result)
else:
print('404')
haijing in HZ 新的一周要开始了~~
2018.10.28 晚