1. 程式人生 > >python學習之路---day18--反射

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)