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

    一:isinstance,type,issubclass

       001:内置函数:isinstance()

         class Base:
                pass
            class Foo(Base):
                pass
            class Bar(Foo):
                 pass
    
            print(issubclass(Bar,Base))  #True  查看Bar是不是Base的子类(issubclass 可以隔代查看)
            print(issubclass(Bar,Foo))  #True  查看Bar是不是Base的子类
    
            print(issubclass(Foo,object))  #True    Foo是object的子类
            print(issubclass(Bar,object))   #True   Bar是object的子类
            print(issubclass(Base,object)) #$True   Base是object的子类
            总结:object是所有类的根,面向对象的祖宗,所有的类都他的子类

      02:type:

         001: 返回近准数据类型案例

        print(type("是的啊"))   #<class 'str'>   返回对象的数据类型
            class Person:
                pass
            class HBR(Person):
                pass
            p=HBR()
            print(type(p))   #<class '__main__.HBR'>  可以精准返回数据类型
    
            # 计算a+b的结果,数学运算
            def cul(a,b):
                if (type(a)==int or type(a)==float) and (type(b)==int or type(a)==float):
                    return a+b
                else:
                    print("有问题,无法计算!")
    
            c=cul(3,5)
            print(c)

     03:isinstance()  判断xxx对象是否是xxx类型的  不能隔代 

        class Animal:
                pass
            class Cat(Animal):
                pass
            class BosiCat(Cat):
                pass
    
            c=Cat()
            print(type(c))   #<class '__main__.Cat'>   c的类型是 cat
            print(c,BosiCat)  #Faslse
            # print(isinstance(c,BosiCat))  # False
            print(isinstance(BosiCat,Animal))   #False 不能隔代查看

      04:) 迭代器 

        from collections import Iterator
            lst=[]
            it=lst.__iter__() #list_iterator
            print(isinstance(it,Iterator))   #True

    二:判断是函数还是方法

    def Person():
                pass
            print(Person)   #<function Person at 0x000000AFF572EB70> 打印结果显示这个是函数
    
            class Person:
                def shuai(self):  #实例方法
                    pass
                @staticmethod
                def chou(): #静态方法 可以将方法转换为常数运算
                    pass
                @classmethod
                def gao(cls):
                    pass
    
            p=Person()
    
            通过打印查看是方法还是函数:  # FunctionType:函数     # MethodType: 方法
            print(p.shuai())  #加括号打印就是 调用了,会返回值得
            用对象来访问 --〉   对象.方法
            print(p.shuai)  #打印显示是方法   <bound method Person.chi of <__main__.Person object at 0x0000001208A4D400>>
            print(p.chou)   #打印显示静态方法是一个函数   <function Person.he at 0x00000006415EE9D8>
            print(p.gao)   #打印显示类方法是一个方法 <bound method Person.gao of <class '__main__.Person'>>
    
            用类名来访问 ---〉 类名.方法
            print(Person.shuai)   #打印显示方法是一个函数  <function Person.shuai at 0x000000ABD8D8EAE8>
            print(Person.chou)   #打印显示静态方法是一个函数<function Person.chou at 0x000000ABD8D8E9D8>
            print(Person.gao)   #打印显示类方法是一个方法<bound method Person.gao of <class '__main__.Person'>>
            总结       静态方法都是函数
                       类方法都是方法,类也是一个对象,也可以创建对象
                      实例方法用对象访问就是方法,用类名访问就是函数
    
    三:md5加密算法:
         01:md5 算法是一种不可逆的加密算法:
            # md5 使用案例:登录密码验证(md5 是一种不可逆的加密方式)
            import hashlib  #倒入模块
            salt=b"fsdfse"    #设置一个加盐指令  必须要  b""  以b开头
            def jiami(n):
                obj=hashlib.md5(salt)  #固定格式,创建对象,可以给对象加盐(二次加密),也可以不加盐
                obj.update(n.encode("utf-8"))  #将明文转换为密文
                return obj.hexdigest()   #获取密文
    
            # 注册:
            usn=input("请输入你的注册ID:")
            pd=input("请输入你的密码:")
            pd=jiami(pd)
            # print(pd)  #查询 查询加密后的密文
    
    
            n=1
            #登陆 三次机会
            while n<4:
                print("登陆界面")
                usename=input("请输入你的用户名:")
                password=input("请输入你的密码:")
                if usename==usn and pd==jiami(password):  #查看输入后的密码在加密后是不是与原密码加密后的源码一样
                    print("欢迎登陆")
                    break
                else:
                    print("账号或则密码错误")
                n+=1

    四:反射

    基本知识点:我们可以创建一个Tom.py文件,然后在另外一个新的py文件里,先通过倒入 import.Tom  这个文件
        来实现访问Tom这个文件
        主要用到的-知识点:三个函数
            hasattr()  :判断源文件(这里指Tom这个文件) 是否有我们要调用的方法名
            getattr():从原文件调用我们需要的内容
            delattr():删除原文件我们不需要的内容
            三个函数都是在内存里面进行的,我们在倒入 import.Tom 这个文件时,文件已经暂存在内存里面了,动作都在在内存里面操作进行的
    
        实例例子:
        import Tom
        class Car:
            def __init__(self,color,pai,price):
                self.color=color
                self.pai=pai
                self.price=price
    
            def fly(self):
                print("飞的高点吧")
        c=Car("黄色","qq",1233)
        # delattr(Car,"fly")  #操纵我们的类或则对象
        # c.fly() #AttributeError: 'Car' object has no attribute 'fly'
    
        #将原来的属性改为其它的
        # setattr(Car,"fly",lambda n:print("我要飞的更高"))
        # c.fly()   #我要飞的更高
        # print(c.color)  #黄色
        # 将原来的实例变量改为新的
        setattr(c,"color","粉色")
        print(c.color)    #粉色
        print(getattr(c,"pai"))   #qq
        print(c.pai)    #qq
        setattr(c,"pai","达蹦")
        print(c.pai)       #达蹦
        print(Tom.name)    #hello world
        setattr(Tom,"name","bbbbb")
        print(Tom.name)
  • 相关阅读:
    使用MFC界面库LibUIDK制作超酷界面
    使用WSH和WMI实现定时记录系统CPU和内存使用率
    关于CreateFileMapping的问题
    360对NSIS误报Malware.QVM06.GEN的解决办法
    win2003实现单用户远程登录
    All bytes must be within the maximum size specified by CreateFileMapping
    解决在VS2005中“当前不会命中断点。源代码与原始版本不同”的问题
    static library中能不能带资源
    HUDSON_HOME
    USB GUID查找
  • 原文地址:https://www.cnblogs.com/one-tom/p/9936955.html
Copyright © 2011-2022 走看看