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)
原文地址:https://www.cnblogs.com/one-tom/p/9936955.html