一 isinstance() 、type()、 issubclass()
- issubclass(xxx,ooo)内置函数可以帮我们判断类xxx类是不是ooo类的子类。
class AAA: pass class BBB(AAA): pass class CCC(BBB): pass print(issubclass(BBB,AAA)) #True print(issubclass(AAA,BBB))#False print(issubclass(CCC,AAA)) #True 可以隔代检测
- type(obj) 查看obj是由哪个类创建的。
type
- isinstance(xxx,ooo)判断xxx的数据类型是不是ooo,或者判断xxx()对象是不是在ooo类下,只能向上判断。
class AAA: pass class BBB(AAA): pass class CCC(BBB): pass num = 3 print(isinstance(BBB(),AAA)) #True print(isinstance(AAA(),BBB))#False print(isinstance(CCC(),AAA)) #True 可以隔代检测 print(isinstance(num,int))#True
二、区分函数和方法
1 首先看一个函数和方法
def pao(): print('跑得快') class Tiao: def tiao(self): print('跳得高') t = Tiao() print(pao)#<function pao at 0x036F7F18> print(t.tiao)#<bound method Tiao.tiao of <__main__.Tiao object at 0x036F6A70>>
打印出他们的函数名明显可以看到function和method是不是意味着就这样就可以区分了呢,其实不然。继续看下面的代码。
在这之前需要了解两个概念:
1.所有的⽅法都是MethodType的实例
2.所有的函数都是FunctionType的实例
判断函数和方法
from types import MethodType, FunctionType 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
由以上可以总结出:
1. 类⽅法. 不论任何情况, 都是⽅法.(类其实也是对象)
2. 静态⽅法, 不论任何情况. 都是函数
3. 实例方法, 如果是实例访问. 就是⽅法. 如果是类名访问就是函数.
三 、反射
如果一个人写了一个项目的代码需要你去测试他写的每一个函数功能,此时我们就可以利用反射的原理去进行检测,正常情况下是先导入模块再去使用模块里面的内容,现在我们需要反着来使用,先导入模块再输入我们需要执行的功能再去模块里面找然后实现。
步骤:1.首先是导入源代码的模块
2.利用 hasattr(obj, str)、getattr(obj,str) 、setattr(obj, str, value)、delattr(obj, str)这四个函数去操作。
#源代码(jiance) def suan(): print('算不出') z = '刘杰' a = 'laal'
import jiance while 1: #逐一检测 s = input('输入你要测试的功能:') if hasattr(jiance,s):#检测你输入的函数是否在原模块内 f = getattr(jiance,s)# 如果原模块有就返回该函数的地址 f()#执行该函数 #算不出 else: print('没有这个功能') ------------------------------------------------------------------------- #在内存中修改或者添加变量或函数 def suan1(): print('我要吃饭') setattr(jiance,'suan1',suan1)#如果需要更改原模块的函数或者添加函数,使用此函数 if hasattr(jiance,'suan1'):#此刻实现的功能就是在内存中添加了suan1函数 f = getattr(jiance,'suan1')#如果更改的就将函数名改为和原模块函数名相同就可以了 f()#我要吃饭 #同样还可以修改和添加变量 setattr(jiance,'a','哎呀') c = getattr(jiance,'a') print(c)# 哎呀 print(jiance.a) #哎呀
delattr(jiance,'z')#删除变量
print(jiance.z)#找不到
class Car: def __init__(self,name,color,price): self.name = name self.color = color self.price = price def fly(self): print('我会飞') c=Car('红旗','黑色','12000') c2=Car('很多','asd','2222') c.fly() setattr(Car,'fly',lambda self:print('我还会跳'))#更改类中方法 c.fly()#我还会跳 print(c.color) setattr(c,'color','红色')#更改属性 print(c.color)#红色 delattr(Car,'fly')#删除方法 print(c.price) c2.fly()#删除了方法,无法访问
四、MD5加密
md5加密是不可逆的。
import hashlib # r = b'ldk55451254adha' r2 = bytes('卡卡'.encode('utf8')) obj = hashlib.md5(r2)#可以加一段 obj.update('983212'.encode('utf8')) miwen = obj.hexdigest() print(miwen)#7abce2520806c381fb696115cc71788a