python面向对象中的反射:通过字符串的形式操作对象相关的属性
python中的一切事物都是对象(都可以使用反射)
四个反射相关的函数
-hasattr :判断是否有此变量,返回bool 值
-getattr : 获取属性值或者获取方法变量的地址
-setattr :给类或者对象设置属性或者方法 (用的场合很少,了解即可)
-delattr: 删除类或者对象的属性或方法(用的场合很少,了解即可)
- 反射类的属性和方法
- 反射对象的属性和方法
- 反射模块的属性和方法
1 getattr()
获取对象/类中的成员
格式 getattr(对象,'属性名'[成员不存在是的默认值])
返回值: 成员的值
练习1 获取静态方法和类方法
class Teacher(object):
#类的静态属性
dict = {'查看学生的信息':'show_student','查看讲师的信息':'show_teacher'}
def __init__(self,name,age):
self.name = name
self.age = age
#类方法
@classmethod
def func(cls):
print('类方法')
#静态方法
@staticmethod
def func1():
print('静态方法')
def show_student(self):
print('show_student...')
def show_teacher(self):
print('show_teacher...')
# 反射类方法和静态属性
# getattr()方法
#第一个参数是对象(一切皆对象,类也是对象),第二个参数是属性的字符串形式
attr = getattr(Teacher,'dict')
print(attr) #{'查看学生的信息': 'show_student', '查看讲师的信息': 'show_teacher'}
func = getattr(Teacher,'func')
func() #类方法
#2获取对象的属性值和普通方法
#获取属性
teacher = Teacher('zs','123')
name = getattr(teacher,'name')
print(name) #zs
#获取方法
show_student = getattr(teacher,'show_student')
show_student() #show_student...
2,hasattr()
检测对象/类是否是其中的某个成员
格式hasattr(对象/类,'成员名')
返回值 成员的值
class Teacher(object):
dict = {'查看学生的信息':'show_student','查看讲师的信息':'show_teacher'}
def __init__(self,name,age):
self.name = name
self.age = age
@classmethod
def func(cls):
print('类方法')
@staticmethod
def func1():
print('静态方法')
def show_student(self):
print('show_student...')
def show_teacher(self):
print('show_teacher...')
#练习1 判断类中是否有dict1 静态属性
b = hasattr(Teacher,'dict1')
if b :
getattr(Teacher,'dict1')
else:
print('没有当前属性')
# 练习2, 根据用户输入的key来调用对应的方法
key = input('请输入>>>>')
teacher = Teacher('zs',10)
b = hasattr(teacher,teacher.dict.get(key,''))
if b:
func = getattr(teacher,teacher.dict[key])
func()
else:print('不存在')
setattr()
设置或添加对象/类中的成员
格式:setattr(对象名,‘成员名’,值)
返回值 None
# 练习1,给A类添加静态属性 age 属性
class A(object):
pass
#给类设置静态属性
setattr(A,'age',10)
print(A.age)
#练习2 :A类的对象添加name属性
a = A()
setattr(a,'name','zs')
print(a.name)
"""
10
zs
"""
delattr()
删除对象/类中的成员
格式 delattr(对象,成员)
返回值 None
# 练习1,给A类添加静态属性 age 属性
class A(object):
pass
#给类设置静态属性
setattr(A,'age',10)
print(A.age)
#练习2 :A类的对象添加name属性
a = A()
setattr(a,'name','zs')
print(a.name)
# 练习1 删除a对象中的name属性
delattr(a,'name')
# 练习2 删除A类的age属性
delattr(A,'age')
1 反射导入模块中的属性,函数,类
第一个参数是模块名称,第二个参数是变量名称
练习1 :反射test模块中的属性 函数 和类
import test
print(test.day) #星期1
#反射模块中的属性
print(getattr(test,'day')) #星期1
#反射模块中的方法
func = getattr(test,'func')
func() #哈哈哈
#反射模块中的类
A = getattr(test,'A')
a = A()
a.func1() #func....
func = getattr(test,'func2')
func('zs') #name--->>> zs
2反射自己的模块中的属性和函数 ,借助sys模块获取当前模块的名称。
练习1 查看当前的所有模块
import sys
#查看所有模块
print(sys.modules)
#练习2 反射当前模块中的name变量。
name= 'zs'
attr = getattr(sys.modules['__main__'],'name')
print(attr)
#练习3 反射当前模块中的函数
#反射函数
def func():
print('哈哈哈')
fun = getattr(sys.modules['__main__'],'func')
fun()
#注意事项 :如果本模块作为导入模块,模块的名称就不是__main__,
# 因此使用__name__属性动态获取
fun = getattr(sys.modules[__name__],'func')
fun()
3反射内置模块
用法和反射导入模块相同
练习1 反射time模块 和time()函数
import time
print(time.time())
t = getattr(time,'time')
print(t())