python中的反射

反射 通过字符串操作对象(类,空间)的属性或方法
可以以整个模块(py文件)作为对象,调用模块中的函数
可以使用.(点)来调用的都可以用反射的方式去做
反射是一组:四个方法
hasattr *** 判断类或者对象是否有这个属性或方法有则返回Ture无则返回False
getattr *** 得到类或对象的属性值或函数的地址
setattr * 设置类或对象的属性,或方法
delattr * 删除类或对象的属性或方法
class A:
    rock = '洛奇'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def func(self):
        print('666')


print(hasattr(A, 'rock'))   # 判断A这个类中是否有rock属性
print(hasattr(A, 'func'))   # 判断A这个类中是否有func方法
#
# # 可以通过输入或接收字符串来执行相应的方法
content = input('>>>:').strip()
print(hasattr(A, content))
print(getattr(A, content))

# 若输入的是func
if hasattr(A, content):
    getattr(A, content)(1)

a = A('bob', 18)
print(hasattr(a, 'name'))   # Ture
print(hasattr(a, 'gender'))  # False
print(getattr(a, 'age'))    # 18

setattr(a, 'gender', 'male')
print(a.__dict__)   # {'name': 'bob', 'age': 18, 'gender': 'male'}
setattr(a, 'func2', lambda x: x**2)
print(a.func2(2))   # 4


def func3(x):
    print(x)
#
setattr(a, 'func3', func3)  # 可给类或对象增加一个方法
a.func3(2)  # 2

delattr(a, 'name')
print(a.__dict__)   # 删除对象的一个属性

同过sys模块吧模块名当作对象,利用反射操作本模块中的函数和变量
# 同过sys模块吧模块名当作对象,利用反射操作本模块中的函数和变量
import sys
obj = sys.modules[__name__]
# print(obj)
# print(obj.__dict__)
# print(globals())
# obj1 = globals()
# print(obj1['__file__'])


def func1():
    print('in func1')


def func2():
    print('in func2')


def func3():
    print('in func3')


l1 = ['func%s' % i for i in range(1, 4)]    # ['func1', 'func2', 'func3']

print(l1)
for i in l1:
    getattr(obj, i)()
#
# # 通过输入相应序号执行相应函数
content = int(input('>>>:'))
getattr(obj, l1[content-1])()

 

通过反射调用其他模块中的函数,变量,类

# 在另一个文件中写好以下代码 
# 如day22
flag = True


def func(a):
    print(a)
    return a + 3


class B:
    name_list = ['rock', 'America']

    def __init__(self, name, gender):
        self.name = name
        self.gnder = gender

    def func(self):
        print(4455)

# 新建一个模块
# 首先导入模块

import day22

# 到另一模块中flag的值
print(getattr(day22, 'flag'))
# 
# # 执行另一模块中func函数
print(getattr(day22, 'func')(10))

# 调用另一模块中B类中的name_list
print(getattr(day22.B, 'name_list'))

# 调用另一模块中B类中的func方法
getattr(day22.B, 'func')(1)

# 用另一模块中的B类实例化对象b
b = day22.B('rock', '')

# 用b对象调用类中的方法
print(getattr(b, 'name_list'))
# 用b对象调用自己的属性
print(getattr(b, 'name'))
getattr(b, 'func')()

 




posted @ 2019-01-18 21:00  平平无奇小辣鸡  阅读(293)  评论(0编辑  收藏  举报