zoukankan      html  css  js  c++  java
  • Python 中的反射方法

    一、概述
    getattr # 根据字符串为参数,去对象中找与之同名的成员。
    hasattr # 根据字符串为参数,去判断对象中是否有与之同名的成员。
    setattr # 根据字符串为参数,动态的设置一个成员(内存)
    delattr # 根据字符串为参数,动态的删除一个成员(内存)
    二、反射方法在模块中的应用
    #handler.py
    
    f0 = 9
    def f1():
        print('F1')
    def f2():
        print('F2')
    def f3():
        print('F3')
    def f4():
        print('F4')
    def f5():
        print('F5')
    
    #run.py
    from types import FunctionType
    import handler
    
    while True:
        print("""
        系统支持的函数有:
            1. f1
            2. f2
            3. f3
            4. f4
            5. f5
        """)
        val = input("请输入要执行的函数:") # val = "f1"
        if hasattr(handler,val):
            func_or_val = getattr(handler,val)     # 根据字符串为参数,去模块中寻找与之同名的成员。
            print(func_or_val)
            if isinstance(func_or_val,FunctionType):
                func_or_val()
            else:
                print(func_or_val)
        else:
            print('handler中不存在输入的属性名')
    # xx.py
    
    x1 = 123
    
    def f1(arg):
        print(arg,666)
    
    
    #run.py
    import xx
    
    # getattr
    v1 = getattr(xx,'x1')
    v2 = getattr(xx,'f1')
    v2('杨森')
    
    # hasattr
    v3 = hasattr(xx,'x1')
    v4 = hasattr(xx,'f1')
    v4 = hasattr(xx,'f1')
    v5 = hasattr(xx,'xxxxxxx')
    print(v3,v4,v5)
    
    # setattr
    setattr(xx,'x2',999)
    v6 = getattr(xx,'x2')
    print(v6)
    
    # setattr(xx,'f2',lambda x:x+1)
    v7 = getattr(xx,'f2')
    v8 = v7(1)
    print(v8)
    
    # delattr
    delattr(xx,'x1')
    v9 = getattr(xx,'x1')
    print(v9)

    三、反射方法在面向对象中的应用

    简单事例:

    class Foo(object):
        country = "中国"
        def func(self):
            pass
    
    v = getattr(Foo,'func') # Foo.func # 根据字符串为参数,去类中寻找与之同名的成员。
    v1 = getattr(Foo,'country')
    print(v,v1)    #<function Foo.func at 0x00000000022CE730>     中国
    
    obj = Foo()
    v = getattr(obj,"func") # obj.func # 根据字符串为参数,去对象中寻找与之同名的成员。
    v1 = getattr(Foo,'country')
    print(v,v1)    #<bound method Foo.func of <__main__.Foo object at 0x000000000225DCF8>>   中国
    
    # 注意:再类中寻找与参数同名的成员,如果原来的成员是一个方法,那么打印出来变成一个函数.

    用反射方法完成简单的登陆、退出、注销功能:

    class Account(object):
        func_list = ['login', 'logout', 'register']
    
        def login(self):
            """
            登录
            :return:
            """
            print('登录111')
    
        def logout(self):
            """
            注销
            :return:
            """
            print('注销111')
    
        def register(self):
            """
            注册
            :return:
            """
            print('注册111')
    
        def run(self):
            """
            主代码
            :return:
            """
            print("""
                请输入要执行的功能:
                    1. 登录
                    2. 注销
                    3. 注册
            """)
    
            choice = int(input('请输入要执行的序号:'))
            func_name = Account.func_list[choice-1]
    
            # func = getattr(Account,func_name) # Account.login
            # func(self)
    
            func = getattr(self, func_name)  # self.login
            func()
    
    obj1 = Account()
    obj1.run()
  • 相关阅读:
    Xcode 单元测试
    Oracle积累
    懒人小技巧, Toad 常用偷懒方法
    改变UITableView选中行高亮的颜色
    苹果企业版帐号申请记录
    RGB颜色设置错误
    IOS 设置文件是否使用ARC
    懒人的小技巧, 批处理修改IP
    Go连接MYSQL
    Go中的函数和闭包
  • 原文地址:https://www.cnblogs.com/fengchong/p/9562840.html
Copyright © 2011-2022 走看看