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
        

  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/uiys/p/10673175.html
Copyright © 2011-2022 走看看