zoukankan      html  css  js  c++  java
  • 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')()
    
    
    



  • 相关阅读:
    ubuntu18.04下eclipse修改maven源为阿里源
    Java中使用队列Queue
    Redis学习笔记——Redis的基本操作
    ubuntu安装redis
    Spring Boot使用监听器Listener
    Spring Boot中在程序中获得application.properties中的值
    Spring Boot使用过滤器Filter
    基于GTID的主从架构异常处理流程
    goroutine与调度器
    使用synergyc共享键鼠
  • 原文地址:https://www.cnblogs.com/chen55555/p/10289698.html
Copyright © 2011-2022 走看看