day17 isinstance type issubclass 反射
阿新 • • 發佈:2018-11-09
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 classBar(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("失敗")