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)


猜你喜欢

转载自www.cnblogs.com/one-tom/p/9936955.html