1. 程式人生 > >day17 isinstance type issubclass 反射

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("失敗")