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
        

  • 相关阅读:
    MFC tab页面中获到其它页面的数据
    sqlite数据库中"Select * From XXX能查到数据,但是Select DISTINCT group From xxx Order By group却查不出来
    关闭程序出现崩溃(exe 已触发了一个断点及未加载ucrtbased.pdb)
    springboot 通用Mapper使用
    springBoot 发布war包
    springCloud Zuul网关
    springboot hystrix turbine 聚合监控
    springBoot Feign Hystrix Dashboard
    springBoot Ribbon Hystrix Dashboard
    springBoot Feign Hystrix
  • 原文地址:https://www.cnblogs.com/attila/p/10152092.html
Copyright © 2011-2022 走看看