day17 isinstance type issubclass 反射

1. issubclass,type,isinstance
  1.issubclass 判断xxx是否yyy的子类
    例:
    class Foo:
      pass
    class Bar(Foo):
      pass
    class Base(Bar):
      pass
    print(issbuclass(Bar,Foo))  #TRUE
    print(issubclass(Base,Foo)) #TRUE  可以进行隔代判断
    print(issubclass(Foo,Bar))  #FALSE 
    print(issubclass(Foo, object))  #TRUE
    print(issubclass(Bar, object))   #TRUE
    print(issubclass(BASE, object))   #TRUE object是所有类的根,是面向  对象的祖宗
    
    from collections import Iterator
    lst = []
    it = lst.__iter__() # list_iterator
    print(isinstance(it, Iterator)) # True
    
  2.type  帮我们判断xx数据是xxx书库类型的
   例:在计算时候判断数据类型是否可以进行计算
   def cul(a,b):      #传入两个数a和b,计算他们的和
     if(type(a)==int or type(a)==float) and (type(b)==int or type(b)==float):
          return a +b
     else:
         return "笨蛋,文字和数字分不清"
 3.isinstance 也是判断xx数据是yyy类型的,但是没有type那么精准
      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
    注:isinstance可以判断xx是xx家族体系的,但是只能往上(父类)判断,不能往下判断(子类)
2. 判断函数还是方法
  例
   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(f.static_method) # <function Foo.static_method at 0x10e1c0620>
    
    print(Foo.class_method) # bound method Foo.class_method of <class'__main__.Foo'>>
    print(f.class_method) #<bound method Foo.class_method of <class'__main__.Foo'>>
  结论:
   1.实例函数
     1.用类名访问是函数
     2.用对象访问是方法
    2.静态方法
     1.不管是用对象访问还是类名访问,都是函数
    3.类方法
     1.不管用对象访问还是类名访问,都是方法
     
    如何用程序判断是函数还是方法
    from types import FunctionType,MethodType
    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
3. 反射:手动输入要运行的功能. 反着去模块里找. 这个就叫反射
    例 :
    impor master #导入模块
    from types import FunctionType       #导入函数模块
    while 1:
        gongneng=input("请输入你要测试的功能")
        if hasattr(master,gongneng):           #判断是否存在这个功能
            fn=getattr(master,gongneng)        #获取这个功能
            if isinstance(fn,FunctionType)       判断是否函数                        
                fn()                             #是函数就运行运行这个功能
            else:                                #不是就打印
                print("fn")
    class Car:
    def __init__(self,color,pai,price):
        self.color=color
        self.pai=pai
        self.price=price
    def fly(self):
        print("我的车会飞")
    c=Car("红色","京34234",1111)
    c.fly()               #我的车会飞
    # delattr(Car,"fly")
    # c.fly()           #'Car' object has no attribute 'fly'
    #                   #方法被删掉了删除 删除方法只能通过类名
    setattr(Car,"fly",lambda self:print("我的天,我的车可以打飞机"))
    c.fly()                     #我的天,我的车可以打飞机

    # print(c.color)          #红色
    # setattr(c,"color","黄色")
    # print(c.color)            #黄色 设置成了黄色,要设置属性只能去找对象
    
    getattr(模块,字符串) 从对象中获取XX功能
           可以从模块中获取功能,也可以从对象获取功能
           因为在python中,一切皆为对象
    hasattr()用来判断xxx中是否包含了xxx功能
    setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这里的value可以是
        值, 也可以是函数或者算法
    delattr(obj, str) 把obj中的str成员删除掉
    这几个操作都是在内存里面进行的,并不会影响你的源代码
    简写:
    hasattr(对象, 属性(字符串))
    getattr(对象, 属性(字符串)) 从对象中获取到xxx属性

    setattr(对象, 属性, 值)
    delattr(对象, 属性) 从对象中删除xxx属性
4.MD5加密   不可逆加密
    import hashlib
    obj = hashlib.md5(加盐)
    obj.update(铭文的bytes)
    obj.hexdigest() 获取密文
    
    例
    import hashlib
    SALT = b"abcdefghijklmnjklsfdafjklsdjfklsjdak"
    def jiami(content):
        obj = hashlib.md5(SALT)
        obj.update(content.encode("utf-8"))
        return obj.hexdigest()
        
    注册
    username = input("请输入你的用户名:") 
    password = input("请输入你的密码:")
    password = jiami(password)
    
    登录
    username = input("请输入你的用户名:")
    password = input("请输入你的密码:")

    if uname == username and upwd == jiami(password):
        print("登录成功")
    else:
        print("失败")

 

posted @ 2018-11-09 19:10  阿布_alone  阅读(188)  评论(0编辑  收藏  举报
TOP