zoukankan      html  css  js  c++  java
  • Python面试题之Python对象反射、类反射、模块反射

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

    一、getattr

    对象获取

    class Manager:
        role = "管理员"
        def __init__(self,name,sex,phone,mail):
            self.name = name
            self.sex = sex
            self.phone = phone
            self.mail = mail
    
        def createClass(self):
            print("create class")
    
        def createTeacher(self):
            print("createTeacher")
    
        def createStu():
            print("createStu")
    
    manager = Manager("safly","",123456,123456)
    
    
    print("---对象获取对象方法-----")
    f = getattr(manager,"createClass")
    f()
    
    print("---对象获取对象属性-----")
    name = getattr(manager,"name")
    print(name)
    
    print("---对象获取类属性-----")
    role = getattr(manager,"role")
    print(role)
    
    print("---对象获取类属性(可以设置默认值)-----")
    import logging
    if  hasattr(manager,"role1"):
        role = getattr(manager,"role1","roleDefault")
        print(role)
    else:
        logging.warn("没有role属性")
        role = getattr(manager, "role1", "roleDefault")
        print(role)

    类获取

    class Manager:
        role = "管理员"
        def createClass(self):
            print("create class")
    
        def createStu():
            print("createStu")
    
    m = Manager()
    
    f = getattr(Manager,"createClass")
    f(Manager)
    
    f = getattr(Manager,"createClass")
    f(m)
    
    role = getattr(Manager,"createStu")
    role()
    
    #对象获取类属性
    role = getattr(Manager,"role")
    print(role)

    输出如下:

    create class
    create class
    createStu
    管理员

    二、setattr

    设置类属性、方法

    class Manager:
        role = "管理员"
        def __init__(self,name,sex,phone,mail):
            self.name = name
            self.sex = sex
            self.phone = phone
            self.mail = mail
    
        def createClass(self):
            print("create class")
    
        def createTeacher(self):
            print("createTeacher")
    
        def createStu():
            print("createStu")
    
    
    manager = Manager("safly","",123456,123456)
    
    print("----设置类属性------")
    setattr(Manager,"country","china")
    print(Manager.country)
    
    print("----删除类属性------")
    delattr(Manager,"country")
    # #删除报错
    # print(Manager.country)
    print("----设置类方法------")
    def Method(parm):
        print("我是被绑定的class之外的方法parm--",parm)
    
    setattr(Manager,"Method",Method)
    Manager.Method("saf")
    Manager.Method(Manager)
    Manager.Method(manager)
    
    def Method():
        print("我是被绑定的class之外的方法parm--")
    setattr(Manager,"Method",Method)
    Manager.Method()

    输出如下:

    E:pythonpython_sdkpython.exe E:/python/py_pro/demo.py
    ----设置类属性------
    china
    ----删除类属性------
    ----设置类方法------
    我是被绑定的class之外的方法parm-- saf
    我是被绑定的class之外的方法parm-- <class '__main__.Manager'>
    我是被绑定的class之外的方法parm-- <__main__.Manager object at 0x0343B4B0>
    我是被绑定的class之外的方法parm--
    
    Process finished with exit code 0

    设置对象属性、方法

    class Manager:
        role = "管理员"
        def __init__(self,name,sex,phone,mail):
            self.name = name
            self.sex = sex
            self.phone = phone
            self.mail = mail
    
        def createClass(self):
            print("create class")
    
        def createTeacher(self):
            print("createTeacher")
    
        def createStu():
            print("createStu")
    
    
    manager = Manager("safly","",123456,123456)
    
    print("----设置对象属性------")
    setattr(manager,"age",20)
    print(manager.age)
    
    print("----删除对象属性------")
    delattr(manager,"age")
    # 'Manager' object has no attribute 'age'
    # print(manager.age)
    
    print("---对象不能删除类属性---")
    setattr(Manager,"country","china")
    print(Manager.country)
    # delattr(manager,"country")
    # print(Manager.country)
    
    print("----设置对象方法------")
    def create_course(self):
        print('创建了一个课程')
    
    setattr(manager,'create_course',create_course)
    manager.create_course(manager)
    
    def create_grade():
        print('创建了一个班级')
    setattr(manager,'create_grade',create_grade)
    manager.create_grade()

    输出如下:

    E:pythonpython_sdkpython.exe E:/python/py_pro/demo.py
    ----设置对象属性------
    20
    ----删除对象属性------
    ---对象不能删除类属性---
    china
    ----设置对象方法------
    创建了一个课程
    创建了一个班级
    
    Process finished with exit code 0

    三、模块反射

    创建一个模块mokuai.py

    a = 1
    def method(rag):
        print(rag)
        return "666"

    然后在python.py中导入以上模块

    import mokuai
    print(getattr(mokuai,"a"))
    method = getattr(mokuai,"method")
    ret = method(8888)
    print(ret)

    输出如下:

    1
    8888
    666

    四、反射本模块函数、变量

    aa = 11
    def method():
        print("---method---")
    import sys
    
    print(sys.modules[__name__])
    print(getattr(sys.modules[__name__],"aa"))
    f = getattr(sys.modules[__name__],"method")
    f()

    输出如下:

    E:pythonpython_sdkpython.exe E:/python/py_pro/demo.py
    <module '__main__' from 'E:/python/py_pro/demo.py'>
    11
    ---method---
    
    Process finished with exit code 0

    参考

  • 相关阅读:
    算法之我见
    meobius与DBTwin实现原理
    MongoDB应用学习
    重要通知
    lucenc代码阅读指南、测试范例
    什么是IoC以及理解为什么要使用Ioc
    策略模式实现支持多种类数据库的DBHelp
    为什么使用TFS 2012进行源代码管理——TFS 2012使用简介(一)
    我们到底能走多远系列
    Eclipse+Tomcat+MySQL+MyEclipse
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/9200988.html
Copyright © 2011-2022 走看看