1. 程式人生 > >python 反射、md5加密

python 反射、md5加密

一、issubclass,type,isinstance

  1、issubclass :判斷xx類是否是yyy型別(包括子類),用於類之間的判定

class GrandF:
    pass
class Father(GrandF):
    pass
class Son(Father):
    pass
print(issubclass(Son,Father))#True
print(issubclass(Son,GrandF))#True 可以隔代判斷型別,子類屬於父類的父類
print(issubclass(Father,Son))#False 父類不屬於子類

  2、type :精確的返回資料型別

# type( ) 精確的返回資料型別
class Foo:
    pass
class Bar(Foo):
    pass
b=Bar()
print(type(b))#<class '__main__.Bar'>(返回離自己最親的那個資料型別)
print(type(Bar))#<class 'type'>

  3、isinstance:也可以判斷xx是yyy型別的資料,但是沒有type那麼精準,可以往上判斷

#isinstance
class GrandF:
    pass
class Father(GrandF):
    pass
class Son(Father): pass s=Son() f=Father() g=GrandF() print(isinstance(s,Son))#True 兒子是屬於兒子型別 print(isinstance(s,Father))#True 兒子也屬於父親型別的 print(isinstance(s,GrandF))#True 兒子也屬於爺爺型別的 print(isinstance(g,Father))#False # isinstance 可以判斷物件屬於xx型別,可以網上判斷,不能往下判斷

 

二、區分函式和方法

  1、function:函式

    method:方法

  2、判斷方法  

# 判斷方法還是函式
from types import MethodType,FunctionType
...
print(isinstance(xx,MethodType)) #返回True則為方法
print(isinstance(xx,FunctionType)) #返回True則為函式

  3、總結

    1、類方法:不論什麼情況,都是方法

    2、靜態方法:不管什麼時候,都是函式

    3、例項方法:如果是例項訪問,則是方法;如果是類名訪問就是函式

 

三、反射

  1、外部檔案如:daniu.py

def chi():
  print("⼤⽜⼀頓吃100個螃蟹")
def he():
  print("⼤⽜⼀頓喝100瓶可樂")
def la():
  print("⼤⽜不⽤拉")
def shui():
  print("⼤⽜⼀次睡⼀年")
wife="豬小妹"

  2、引入外部檔案 import

import daniu
while 1:
    s=input("輸入你想要測試的功能:")
    if hasattr(daniu,s):#判斷daniu檔案裡面是否存在s功能
        fn=getattr(daniu,s)#如果存在,獲取控制代碼
        fn()#執行s功能
    

  3、反射常用的命令

hasattr(物件,屬性(字串)) 檢視物件中是否存在該屬性,如果存在返回True
getattr(物件,屬性(字串)) 獲取物件中xxx屬性,並返回
setattr(物件,屬性(字串),值) 1、如果物件中存在該屬性,則直接賦值
                                        2、如果不存在,則新建該屬性,並賦值
delattr(物件,屬性(字串)) 從物件中刪除該屬性

 

四、md5加密

  1、準備點鹽(SALT=b' adfsgghhjh) --------------------(非必需步驟)

  2、流程:

import hashlib
obj=hashlib.md5(加鹽)
obj.update(銘文的,bytes)
obj.hexdigest( )獲取密文

   3、例項:賬戶登入加密

# 主要應用於密碼的加密
import hashlib
#
SALT=b"ssfSGDF456AGSas"

# 製作加密函式
def jiami(connent):
    obj=hashlib.md5(SALT) #建立md5物件
    obj.update(connent.encode("utf-8")) #必須使用bytes型別銘文
    return obj.hexdigest()

# # 註冊
# username=input("請輸入使用者名稱:") #joinl
# passwd=input("請輸入密碼:") #1234567
# passwd=jiami(passwd)
# print(passwd) #504510efd4c441addb07d1371442557e

uname="joinl"
upwd="504510efd4c441addb07d1371442557e"

# 登陸
username=input("請輸入使用者名稱:")
passwd=input("請輸入密碼:")
if uname==username and jiami(passwd)==upwd:
    print("登陸成功")
else:
    print("登陸失敗")