• 面向对象-06-反射


    '''
    1.反射在模块中的应用: 假设此处有一个模块 handel 里面有f1,f2,f3三个函数
    def f1():
    print('f1')
    def f2():
    print('f2')
    def f3():
    print('f3')

    import handel

    while true:
    print("您可以选择三个函数:
    1.f1
    2.f2
    3.f3
    ")
    val = input('请输入你要执行的函数:')

    # hasattr是帮你查询handel模块中是否有对应val的函数或变量.
    if hasattr(handler, val):
    func = getattr(handel, val) #getattr是帮你在handel模块中,以字符串的形式查找所输入的val,对应的函数或变量.
    func() 如此处若输入f1,则getattr会在handel中查找名为f1的函数或变量.
    else:
    print('你所输入的函数没有')

    2.反射在类中的应用:
    class Foo(object):
    country = '中国'

    def func(self):
    print(123)
    obj = Foo()

    (1)# 当getattr的第一个参数为类时,表示在该类中以字符串的形式查找名为,第二个参数的函数或变量
    v = getattr(Foo, 'func') # 查找Foo中的'func'函数,这句代码相当于 Foo.func 不带括号的
    print(v) # 得到的是func函数的地址,要想执行函数还需要 v(obj)

    (2)# 当getattr的第一个参数为对象时,表示在该对象的类中,以字符串的形式查找,名为第二个参数的函数或变量
    v = getattr(obj, 'func') # 相当于obj.func()
    print(v) #得到的是一个地址,要想执行还需 v() 这次不需要加对象

    3.另外两个方法的补充:
    setattr:根据字符串的形式,去动态的创建一个成员(都是在内存级别上进行的操作)
    delattr:根据字符串的形式,去动态的删除一个成员(都是在内存级别上进行的操作)

    import handel
    v1 = setattr(handel, 'f4', lambda x:x+1) #在handel模块中创建一个函数'f4','f4'中的函数体为x:x+1
    v2 = setattr(handel, 'a', 999) #在handel中创建一个变量a,a的值为999.
    #需要注意的是不管是创建函数还是变量,在handel模块中是不会直接显示的,但他会存在与内存中,你若想查看也可以直接调用

    v3 = delattr(handel, 'a') # 从内存中删掉handel中的'a',但不会表现在handel模块中,只是你今后无法再调用变量'a'了






    '''
  • 相关阅读:
    leetcode933
    leetcode929
    leetcode31
    leetcode29
    leetcode166
    2019-9-2-win10-uwp-保存用户选择文件夹
    2019-9-2-win10-uwp-保存用户选择文件夹
    2018-8-10-如何移动-nuget-缓存文件夹
    2018-8-10-如何移动-nuget-缓存文件夹
    2019-9-2-C#判断文件是否被混淆
  • 原文地址:https://www.cnblogs.com/gongteng/p/13567124.html
Copyright © 2020-2023  润新知