zoukankan      html  css  js  c++  java
  • 反射

    反射在面向对象中是很重要的

    isinstance它判断的是obj是否是此类或者此类的子孙类实例化出来的对象。
    class A: pass
    
    class B(A): pass
    
    obj = B()
    print(isinstance(obj, B))  #True
    print(isinstance(obj, A))  #True
    # isinstance 它判断的是obj是否是此类或者此类的子孙类实例化出来的对象。
    # issubclass 判断B是否是A的子类或者孙类。
    class C: pass
    
    class A(C): pass
    
    class B(A): pass
    
    abj = B()
    
    print(issubclass(B, A)) #True
    print(issubclass(B, C)) #True
    # issubclass 判断B是否是A的子类或者孙类。
    # 反射!
    # hasattr()  ***  #判断对象里面是否有这个属性
    # getattr() *** #从对象里面拿出这个属性
    # setattr() * #在对象里面设置这个属性
    # delattr() * #在对象里面删除这个属性


    # 反射就是:通过 字符串 去操作对象(实例化对象 类, 模块)。
    # 对实例化对象的示例
    class A:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    
    obj = A('脸哥', 27)
    
    ret = getattr(obj,'name')  #getattr取出来
    print(ret) #取出脸哥
    
    # ret1 = getattr(obj,'name1',None)
    # print(ret1)  #None
    print(hasattr(obj,'age'))  #True
    # 用法:
    if hasattr(obj,'name'):
        ret = getattr(obj,'name')   # 让ret=返回的结果,然后往下你想怎么做再怎么做
    # setattr  # 设置
    setattr(obj,'sex','')
    print(getattr(obj,'sex')) # 男
    
    # delattr # 删除
    print(obj.__dict__)  # 打印全部
    delattr(obj,'name')  # 删除obj对象里面的name
    print(obj.__dict__)  #没有name了

    对类的示例
    class A:
        name = 'alex'
        def __init__(self):
            pass
        def func(self):
            print('In func')
    
    print(getattr(A,'name'))  #取name :alex
    ret = getattr(A,'func')
    print(ret)  ##内存地址
    ret(1)  #是内存地址,加()就能执行 1是参数,用于传给self

    作用:

    # 需求:执行以下func方法,通过你输入的内容
    class A:
        name = 'alex'
        def __init__(self):
            pass
        def func(self):
            print('In func')
    ret = input('>>>')
    
    f1 = getattr(A,ret)(1)  #输入func,值是In func 1是函数的传参
    对其他模块的示例:
    已知fs.py文件内容如下:
    n1 = '二狗'
    def func():
    print(666)

    class A:
    name = 'alex'
    def func2(self):
    print('------In func2')
    取出n1,取出func,取出A类对应的name中的‘alex’,取出A类中的func2
    # 用其他模块需要使用import fs
    取出n1
    import fs
    print(getattr(fs, 'n1'))  # 取出n1中的二狗
    取出func
    ret = getattr(fs, 'func')
    ret()  # 取出来了func的内容666
    取出A类对应的name中的‘alex’
    # 方法一
    clas = getattr(fs, 'A')
    # print(clas)  # 取出A类<class 'fs.A'>
    print(clas.name)  # 取出A类的name
    
    # 方法二:
    print(getattr(fs.A, 'name'))
    取出A类中的func2
    getattr(fs.A, 'func2')(1)  # 取出A类的func2 后面的1是手动传的,因为这个是类调用这个方法,所以说你要传一个参数给self,虽然这个参数没有什么用,但是你也得手动传进去一个。 --------IN FUNC2
    对当前模块(文件)的示例:
    import sys
    # print(sys.modules)
    # print(sys.modules[__name__])
    
    
    def func():
        print('in func')
    
    
    import sys
    # print(sys.modules)
    # print(sys.modules[__name__])
    current_module = sys.modules[__name__]
    getattr(current_module, 'func')()   #current_module就是指的当前模块 再取出func,再加上()执行就出来了。

    
    


  • 相关阅读:
    Writing an XMLRPC server or client in ASP.Net: Part 1
    a article test
    基于Android的一个简单多媒体播放器
    一涉及多个知识点的小测试程序
    Android蓝牙测试—发送一文件到另一蓝牙设备
    Android开发入门精品文章导引
    关于List对象的重复项清除和倒序处理
    关于Android的布局
    Android中对文本文件的读写处理
    Android系统中震动功能的测试
  • 原文地址:https://www.cnblogs.com/wangkaiok/p/9988357.html
Copyright © 2011-2022 走看看