zoukankan      html  css  js  c++  java
  • python之路--反射

    一 . isinstance, type, issubclass 

       isinstance 可以判断该对象是否是XXX家族体系中的(只能往上判断)

    class Base:
        pass
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    print(isinstance(Foo(), Foo)) # True
    print(isinstance(Foo(), Base)) # True
    print(isinstance(Foo(), Bar)) # False

      

      type(obj) 表示查看obj是由哪个类创建的.

    class Boy:
        pass
    class Girl:
        pass
    # 统计传进来的男生和女生分别有多少
    def func(*args):
        b = 0
        g = 0
        for obj in args:
            if type(obj) == Boy:
                b += 1
            elif type(obj) == Girl:
                g += 1
        return b, g
    ret = func(Boy(), Girl(), Girl(), Girl())
    print(ret)

      

      issubclass()这个内置函数可以帮我们判断XXX类是否是YYY类型的子类

    class Base:
        pass
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    print(issubclass(Bar, Foo))  # True
    print(issubclass(Foo, Bar))  # False
    print(issubclass(Bar, Base))  # True

    二 . 区分函数和方法

    class Foo:
        def chi(self):
             print("我是吃")
        @staticmethod
        def static_method():
            pass
        @classmethod
        def class_method(cls):
            pass
    f = Foo()
    print(f.chi) # <bound method Foo.chi of <__main__.Foo object at0x10f688550>>
    print(Foo.chi) # <function Foo.chi at 0x10e24a488>
    print(Foo.static_method) # <function Foo.static_method at 0x10b5fe620>
    print(Foo.class_method) # bound method Foo.class_method of <class'__main__.Foo'>>
    print(f.static_method) # <function Foo.static_method at 0x10e1c0620>
    print(f.class_method) #<bound method Foo.class_method of <class'__main__.Foo'>>

      仔细观察, 我们能得到以下结论:
        1. 类⽅法. 不论任何情况, 都是⽅法.
        2. 静态⽅法, 不论任何情况. 都是函数
        3. 实例⽅法, 如果是实例访问. 就是⽅法. 如果是类名访问就是函数.

      那如何⽤程序来帮我们分辨. 到底是⽅法还是函数呢? ⾸先, 我们要借助于types模块.

    # 所有的方法都是MethodType的实例
    # 所有的函数都是FunctionType的实例
    from types import MethodType, FunctionType
    
    def func():
        pass
    print(isinstance(func, FunctionType)) # True
    print(isinstance(func, MethodType))   # False

    三 . 反射

    # great.py文件
    
    def play():
        print('篮球打的非常好')
    def piao():
        print('pdd是嫖老师')
    def money():
        print('Jack ma 很有钱')
    def game():
        print('pony ma是做游戏的!')
    s = '哈哈哈'

      

    # 反射操作
    
    import great  # great是一个写好的py 文件
    while 1:
        content = input('请输入功能:')
        if hasattr(great,content):
            x = getattr(great,content)
            # x() # 如果是函数可以直接调
            print(x, 'luckly!')
        else:
            print('非常的不幸')

      补充:
        关于反射, 其实⼀共有4个函数:
        1. hasattr(obj, str) 判断obj中是否包含str成员
        2. getattr(obj,str) 从obj中获取str成员
        3. setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这⾥的value可以是值, 也可以是函数或者⽅法
        4. delattr(obj, str) 把obj
        

  • 相关阅读:
    使用Apache Curator监控Zookeeper的Node和Path的状态
    mongo创建用户
    window下关闭nginx
    spring 下载地址
    Quartz Spring与Spring Task总结
    oracle 11g 空表也导出
    修改oracle字符集
    linux 查看最大文件
    JAVA https证书相关
    抽象类与接口
  • 原文地址:https://www.cnblogs.com/attila/p/10152092.html
Copyright © 2011-2022 走看看