zoukankan      html  css  js  c++  java
  • 14 isinstance type issubclass及反射

    一 isinstance() 、type()、 issubclass()

    • issubclass(xxx,ooo)内置函数可以帮我们判断类xxx类是不是ooo类的子类。
    class AAA:
        pass
    class BBB(AAA):
        pass
    class CCC(BBB):
        pass
    print(issubclass(BBB,AAA)) #True
    print(issubclass(AAA,BBB))#False
    print(issubclass(CCC,AAA)) #True 可以隔代检测
    issubclass
    • type(obj) 查看obj是由哪个类创建的。
    type
    • isinstance(xxx,ooo)判断xxx的数据类型是不是ooo,或者判断xxx()对象是不是在ooo类下,只能向上判断。
    class AAA:
        pass
    class BBB(AAA):
        pass
    class CCC(BBB):
        pass
    num = 3
    print(isinstance(BBB(),AAA)) #True
    print(isinstance(AAA(),BBB))#False
    print(isinstance(CCC(),AAA)) #True 可以隔代检测
    print(isinstance(num,int))#True
    isinstance

    二、区分函数和方法

      1 首先看一个函数和方法

    def pao():
        print('跑得快')
    class Tiao:
        def tiao(self):
            print('跳得高')
    t = Tiao()
    print(pao)#<function pao at 0x036F7F18>
    print(t.tiao)#<bound method Tiao.tiao of <__main__.Tiao object at 0x036F6A70>>

     打印出他们的函数名明显可以看到function和method是不是意味着就这样就可以区分了呢,其实不然。继续看下面的代码。

        在这之前需要了解两个概念:

                1.所有的⽅法都是MethodType的实例

                2.所有的函数都是FunctionType的实例

    判断函数和方法
    from types import MethodType, FunctionType
    def func():
        pass
    print(isinstance(func, FunctionType))   # True
    print(isinstance(func, MethodType))     # False
    class Foo:
        def chi(self):
            print("我是吃")
        @staticmethod
        def static_method():
            pass
        @classmethod
        def class_method(cls):
            pass
    obj = Foo()
    print(type(obj.chi))    # method
    print(type(Foo.chi))    # function
    print(isinstance(obj.chi, MethodType))  # True
    print(isinstance(Foo.chi, FunctionType))    # True
    print(isinstance(Foo.static_method, FunctionType))    # True
    print(isinstance(Foo.static_method, MethodType))    # False
    print(isinstance(Foo.class_method, FunctionType))    # False
    print(isinstance(Foo.class_method, MethodType))    # True

    由以上可以总结出:

      1. 类⽅法. 不论任何情况, 都是⽅法.(类其实也是对象)

      2. 静态⽅法, 不论任何情况. 都是函数

      3. 实例方法, 如果是实例访问. 就是⽅法. 如果是类名访问就是函数. 

    三 、反射

        如果一个人写了一个项目的代码需要你去测试他写的每一个函数功能,此时我们就可以利用反射的原理去进行检测,正常情况下是先导入模块再去使用模块里面的内容,现在我们需要反着来使用,先导入模块再输入我们需要执行的功能再去模块里面找然后实现。

    步骤:1.首先是导入源代码的模块

       2.利用 hasattr(obj, str)、getattr(obj,str) 、setattr(obj, str, value)、delattr(obj, str)这四个函数去操作。

    #源代码(jiance)
    def suan():
        print('算不出')
    z = '刘杰'
    a = 'laal'
    import jiance
    
    while 1: #逐一检测
        s = input('输入你要测试的功能:')
        if hasattr(jiance,s):#检测你输入的函数是否在原模块内
            f = getattr(jiance,s)# 如果原模块有就返回该函数的地址
            f()#执行该函数 #算不出
        else:
             print('没有这个功能')
    
    -------------------------------------------------------------------------
    #在内存中修改或者添加变量或函数
    def suan1():
        print('我要吃饭')
    setattr(jiance,'suan1',suan1)#如果需要更改原模块的函数或者添加函数,使用此函数
    if hasattr(jiance,'suan1'):#此刻实现的功能就是在内存中添加了suan1函数
        f = getattr(jiance,'suan1')#如果更改的就将函数名改为和原模块函数名相同就可以了
        f()#我要吃饭
    #同样还可以修改和添加变量
    setattr(jiance,'a','哎呀')
    c = getattr(jiance,'a')
    print(c)# 哎呀
    print(jiance.a) #哎呀

    delattr(jiance,'z')#删除变量
    print(jiance.z)#找不到
    class Car:
        def __init__(self,name,color,price):
            self.name = name
            self.color = color
            self.price = price
        def fly(self):
            print('我会飞')
    c=Car('红旗','黑色','12000')
    c2=Car('很多','asd','2222')
    c.fly()
    setattr(Car,'fly',lambda self:print('我还会跳'))#更改类中方法
    c.fly()#我还会跳
    print(c.color)
    setattr(c,'color','红色')#更改属性
    print(c.color)#红色
    delattr(Car,'fly')#删除方法
    print(c.price)
    c2.fly()#删除了方法,无法访问
    在类中的使用

    四、MD5加密

      md5加密是不可逆的。

    import hashlib
    # r = b'ldk55451254adha'
    r2 = bytes('卡卡'.encode('utf8'))
    obj =  hashlib.md5(r2)#可以加一段
    obj.update('983212'.encode('utf8'))
    miwen = obj.hexdigest()
    print(miwen)#7abce2520806c381fb696115cc71788a

      

  • 相关阅读:
    动态、指针field-symbols初探
    简单的OO ALV显示ALV及下载
    python运算符号
    linux ubuntu 学习总结(day01)基本命令学习
    Linux之Ubuntu基本命令提炼,分条列出
    linux常用基本命令
    EMC光纤交换机故障处理和命令分析
    Java求一个数组中的最大值和最小值
    【SSH网上商城项目实战30】项目总结
    【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表
  • 原文地址:https://www.cnblogs.com/-0121/p/9936742.html
Copyright © 2011-2022 走看看