zoukankan      html  css  js  c++  java
  • 反射

    python面向对象中的反射: 通过字符串的形式操作对象相关属性.python中的一切都是对象(都可以使用反射)

      1.getattr(对象,'一个字符串') : 根据字符串的形式去某个对象中获取对象的成员

        - 获取类中的属性

    class Foo(object):
        def __init__(self,name):
            self.name  = name
        def func(self):
            print(666)
    
    obj = Foo('张三')
    
    # 获取实例变量
    v = getattr(obj,'name')
    print(v)  # 得到结果:  张三
    
    #获取类中的方法
    getattr(obj,'func')()  # 得到结果:  666 

        - 获取当前py文件中的属性

    import sys
    
    def func():
        print(666)
    
    name = '李四'
    
    getattr(sys.modules['__main__'],'func')()   # 执行fanc函数,得到结果:  666
    
    ret = getattr(sys.modules['__main__']),'name')
    print(ret)  # 得到结果:  李四

        - 引用模块中的任意变量

    # demo.py 文件中的属性:
    def func():
         print('in func')
    
    name = '王二麻子'
    
    class User(object):
        def  base(self):
            print('in base')
    obj = User()
    
    
    
    # 运行脚本的文件
    import demo
    
    getattr(a,'func')()    #  in func
    
    getattr(a,name)    # 得到结果: 王二麻子
    
    getattr(a.User,'base')()    #得到结果:  in base
    
    print(getattr(a,'obj')    # # 得到结果: 内存地址

       2. hasattr(对象,'一个字符串') : 根据字符串的形式去某个对象中判断是否有改成员 

    class A:
        job = 'IT'
        def __init__(self):
            self.name = 'alex'
            self.age = 83
        def func(self):
            print('in func')
    
    obj = A()
    
    print(hasattr(obj,'sex'))    # False
    print(hasattr(obj,'func'))   # True
    
    if hasattr(obj,'func'):
        if callable(getattr(obj,'func')):     # 判断这个函数是否可被调用
            getattr(obj,'func')()    # in func

    常用操作:

    class User:
        lis = [('登入','login'),
               ('注册','register'),
               ('删除文件','remove'),
               ('复制文件','copy')]
        def login(self):
            print('in login')
        def register(self):
            print('in register')
        def remove(self):
            print('in remove')
        def copy(self):
            print('in copy')
    
    obj = User()
    for index,item in enumerate(obj.lis,1):
        print(index,item[0])
    while True: num = input('请选择要操作的序号:') if num.isdecimal() and 0 < int(num) <= len(obj.lis): if hasattr(obj,obj.lis[int(num)-1][1]): getattr(obj,obj.lis[int(num)-1][1])() else: print('输入有误')

    运行结果:

    1 登入
    2 注册
    3 删除文件
    4 复制文件
    请选择要操作的序号:1
    in login
    请选择要操作的序号:2
    in register
    请选择要操作的序号:3
    in remove
    请选择要操作的序号:4
    in copy

       3. setattr(对象,'变量','值') : 根据字符串的形式去某个对像中设置某个成员

    class Foo:
        pass
    obj = Foo()
    
    obj.k1 = 999
    
    setattr(obj,'k1',123)    # 设置实例变量中的 k1 = 123   
    
           
    print(obj.k1)     # 打印结果:  123

       4. delattr(对象,'变量') :  根据字符串的形式去某个对象中删除成员

    class Foo:
        pass
    
    obj = Foo()
    
    obj.k1 = 999
    print(obj.k1)    # 打印结果; 999 
    
    delattr(obj,'k1')
    print(obj.k1)    # k1 的变量已经删除,运行会报错

      

  • 相关阅读:
    Nullable<T>、Nullable、null、?修饰符的区别
    使用EF CodeFirst连接MySql数据库
    C# 在项目中配置Log4net
    我的Visual Studio必用工具
    面向对象原则之一 接口隔离原则
    面向对象原则之一 依赖倒置原则
    C# ABP
    面向对象原则之一 开放封闭原则(开闭原则)
    面向对象原则之一 单一职责原则
    C# Owin初探 概念理解(一)
  • 原文地址:https://www.cnblogs.com/wenxin1120/p/10988934.html
Copyright © 2011-2022 走看看