• 面向对象进阶 反射


    面向对象进阶

    反射

    反射:通过字符串的形式操作对象相关的属性

    getattr() 使用字符串数据类型的变量名获取属性值

    hasattr() 使用字符串数据类型的变量名判断属性是否存在

    setattr()  使用字符串数据类型的变量名获修改属性值

    delattr() 使用字符串数据类型的变量名获删除属性值

    复制代码
    class Management:
        role = '管理员'
        def __init__(self,name,sex,phone,mail):
            self.name = name
            self.sex = sex
            self.phone = phone
            self.mail = mail
        def create_class(self):
            print('创建了一个班级')
        def create_teacher(self):
            print('新建了一条讲师信息')
        def create_student(self):
            print('新建了一条学生信息')
    
    manager = Management('小雨','女',1233211234567,'xiaoyu@qq.com')
    # func = input('func:')
    # f = getattr(manager,func)
    # f()
    f = getattr(manager,'phone')  # 使用字符串数据类型的变量名获取属性值
    print(f)
    f = getattr(manager,'phone1','没有这个属性')  # 可以添加找不到的时候的默认值,不然会报错
    print(f)
    cs = getattr(manager,'create_class')  # 使用字符串数据类型的方法名调用方法
    cs()
    print(hasattr(manager,'name'))  # True
    f = getattr(Management,'role')
    print(f)
    
    import logging
    if hasattr(manager,'sex'):
        sex = getattr(manager,'sex')
        print(sex)
    else:
        logging.warning('没有您输入的属性')
    
    # Management.Country = 'China'
    setattr(Management,'Country','China')
    print(Management.Country)  # China
    delattr(Management,'Country')
    
    setattr(manager,'job','teacher')
    print(manager.job)
    delattr(manager,'job')
    
    # 可以通过delattr删除一个类中的方法
    delattr(Management,'create_class')
    
    def create_course(self):
        print('创建了一个课程')
    setattr(manager,'create_course',create_course)
    manager.create_course(manager)
    复制代码

    对象的反射
    类的反射
    模块的反射
    本模块的反射:找到本模块sys.modules[__name__]

    aaa = 'bbb'
    import sys
    print(sys.modules['__main__'])
    print(getattr(sys.modules['__main__'],'aaa'))  # bbb
    print(sys.modules[__name__])
    print(getattr(sys.modules[__name__],'aaa'))
  • 相关阅读:
    system函数
    如何:配置 ClickOnce 信任提示行为
    linux中shell变量$#,$@,$0,$1,$2的含义解释 (转载)
    C/C++中如何在main()函数之前执行一条语句?
    循环小数表示法
    struct/class等内存字节对齐问题详解
    malloc(0)
    C语言实现程序跳转到绝对地址0x100000处执行
    嵌入式程序设计中C/C++代码的优化
    backtrace和backtrace_symbols
  • 原文地址:https://www.cnblogs.com/QQ279366/p/7892209.html
Copyright © 2020-2023  润新知