zoukankan      html  css  js  c++  java
  • 19_python_反射

    一、内置函数(补充)
        
        1、issubclass() -- 方法用于判断参数 class 是否是类型参数 classinfo 的子类。
        语法格式:issubclass(class, classinfo)

                    class -- 类 classinfo -- 类     如果 class 是 classinfo 的子类返回 True,否则返回 False

    1 class A:
    2     pass 
    3 class B(A):
    4     pass
    5 print(issubclass(B,A)) # 返回 True
     
        2、isinstance() -- 函数来判断一个对象是否是一个已知的类型,类似 type()
        (1) isinstance() 与 type() 区别:
     
            type() 不会认为子类是一种父类类型,不考虑继承关系。
            isinstance() 会认为子类是一种父类类型,考虑继承关系。
      
      语法格式:isinstance(object, classinfo)
                   object -- 实例对象
                        classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组
                             如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
    1 >>>a = 2 
    2 >>> isinstance (a,int) True 
    3 >>> isinstance (a,str) False
    4 >>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True True
    1 class A:
    2     pass
    3 class B(A): 
    4     pass 
    5 isinstance(A(), A) # returns True 
    6 type(A()) == A # returns True 
    7 isinstance(B(), A) # returns True 
    8 type(B()) == A # returns False
     1 class Animal:
     2     pass
     3 
     4 class Cat(Animal):
     5     pass
     6 
     7 class BoSiCat(Cat):
     8     pass
     9 
    10 a = Animal()
    11 print(isinstance(a, Animal)) # 自己类可以判断
    12 print(isinstance(a, Cat))   # 子类不能判断
    13 
    14 
    15 
    16 c = BoSiCat()
    17 print(isinstance(c, Animal)) # True  子类的对象可以当成父类的类型来看.
    18 # isinstance判断的是对象是否是xxx家族体系的内容. 往上找

        3、type

     1 class Animal:
     2     pass
     3 
     4 class Cat(Animal):
     5     pass
     6 
     7 class BoSiCat(Cat):
     8     pass
     9 
    10 c = Cat()
    11 print(type(c)) # 比较精准的给出对象的类  <class '__main__.Cat'>
    12 
    13 计算a+b的结果并返回. 两个数相加
    14 def add(a, b):
    15     if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
    16         return a + b
    17 else:
    18     print("算不了")
    19 print(add("胡汉三", 2.5))
    二、判断方法还是函数
     
        1. 类方法. 不论任何情况, 都是方法.
        2. 静态方法, 不论任何情况. 都是函数
        3. 实例例方法, 如果是实例访问. 就是方法. 如果是类名访问就是函数.
    1 # 引入两个模块
    2 from types import FunctionType, MethodType
    3 
    4 def haha(arg):
    5     print(isinstance(arg, FunctionType)) # False
    6     print(isinstance(arg, MethodType)) # True
    7 haha(Foo.age)
    三、反射
     
        1、getattr( )、hasattr()
     1 import master
     2 from types import FunctionType
     3 while 1:
     4     print("""作为, 我帮你写了:
     5     chi
     6     he
     7     la
     8     shui
     9     等功能. 看看吧""")
    10 gn = input("请输你要测试的功能:")
    11 # niuB版
    12 if hasattr(master, gn): # 如果master有你要的功能
    13     
    14     attr = getattr(master, gn)    # 获取这个功能, 并执
    15     if isinstance(attr, FunctionType):    # 判断是否是函数. 只有函数才可以被调
    16         attr()
    17     else:   # 如果不是函数, 就打印
    18         print(attr)    
        getattr()来获取信息. hasattr()来判断xxx中是否包含了xxx功能, 那么我们可以在模块中这样来使反射
     1 class Person:
     2     country = ""
     3     def chi(self):
     4         pass
     5 # 类中的内容可以这样动态的进获取
     6 print(getattr(Person, "country"))
     7 print(getattr(Person, "chi")) # 相当于Foo.func 函数
     8 # 对象样可以
     9 obj = Person()
    10 print(getattr(obj, "country"))  # 
    11 print(getattr(obj, "chi")) # 相当于obj.func 法  
    12 
    13 结果:
    14 15 <function Person.chi at 0x02CB5150>
    16 17 <bound method Person.chi of <__main__.Person object at 0x01055870>>
        2、其他方法 setattr、delattr
        (1) setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这的value可以是值, 也可以是函数或者方法
        (2) delattr(obj, str) 把obj中的str成员删除掉
    1 #设置成员
    2 print(obj.name) #设置之前为:abc
    3 ret = setattr(obj,'name',19)
    4 print(obj.name) #设置之后为:19
    5 #删除成员
    6 print(obj.name) #abc
    7 delattr(obj,'name')
    8 print(obj.name) #报错
    小节:1.根据字符串的形式导入模块。2.根据字符串的形式去对象(某个模块)中操作其成员, 反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动
     1 1. getattr()函数是Python自省的核心函数,具体使用大体如下:
     2 class A:
     3 def __init__(self):
     4 self.name = 'zhangjing'
     5 #self.age='24'
     6 def method(self):
     7 print"method print"
     8   
     9 Instance = A()
    10 print getattr(Instance , 'name, 'not find') #如果Instance 对象中有属性name则打印self.name的值,否则打印'not find'
    11 print getattr(Instance , 'age', 'not find') #如果Instance 对象中有属性age则打印self.age的值,否则打印'not find'
    12 print getattr(a, 'method', 'default') #如果有方法method,否则打印其地址,否则打印default
    13 print getattr(a, 'method', 'default')() #如果有方法method,运行函数并打印None否则打印default
    14 
    15 2. hasattr(object, name)
    16 
    17 说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的)
    18 
    19 3. setattr(object, name, value)
    20 
    21 这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供。例如,setattr(x,“foobar”,123)相当于x.foobar = 12322 
    23 4. delattr(object, name)
    24 
    25 与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=del x.foobar
  • 相关阅读:
    有了这个算法,图像上文字擦除再也用不上PS了
    说说Golang goroutine并发那些事儿
    Redis Sentinel 源码:Redis的高可用模型分析
    从架构设计理念到集群部署,全面认识KubeEdge
    如何极速极速搭建个人博客?Copy攻城狮用的这一招很优秀!
    Python进阶丨如何创建你的第一个Python元类?
    逼疯UE设计师,不可不知的提升产品用户体验的10个测试方法
    一文总结GaussDB通信原理知识
    目标检测推理部署:优化和部署
    GPU上的快速光谱图分区
  • 原文地址:https://www.cnblogs.com/hq82/p/9720876.html
Copyright © 2011-2022 走看看