1. issubclass, type, isinstance
issubclass 判断xxx类是否是xxx类的子类
class Foo(object): pass class Bar(Foo): pass class FooBar(Bar): pass print(issubclass(Bar, Foo)) # True print(issubclass(Foo, Bar)) # False print(issubclass(FooBar, Foo)) # True 可以隔代判断 print(issubclass(Foo, object)) #Ture print(issubclass(Bar, object)) #Ture print(issubclass(FooBar, object)) #Ture # object是所有类的根. 面向对象的祖宗
type 获取到xxx对象的类型
class Animal: pass class Cat(Animal): pass c = Cat() print(type(c)) # 可以精准的返回数据类型
isinstance 判断xxx对象是否是xxx类型的(向上判断)
计算a+b的结果 数学运算 def cul(a, b): if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float): return a + b else: print("不行. 不能帮你计算") print(cul(10, "胡辣汤"))
2. 如何判断一个方法或者一个函数(FunctionType, MethodType)
from types import FunctionType, MethodType
print(isinstance(xx, FunctionType)))
print(isinstance(xx, MethodType)))
结论 :
1. 实例方法:
用类名访问. 函数
用对象访问. 方法
class Car: def run(self): # 实例方法 print("我是车, 我会跑") @staticmethod def cul(): print("我会计算") @classmethod def jump(cls): print("我会jump") # 实例方法 <bound method Car.run of <__main__.Car object at 0x000001E9166B73C8>> c = Car() print(c.run) # <bound method Car.run of <__main__.Car object at 0x000001E9166B73C8>> Car.run(c) # 通过类名也可以访问实例方法. 不要这么干 print(Car.run) # <function Car.run at 0x000002454C748AE8>
2. 静态方法
都是函数
print(c.cul) # <function Car.cul at 0x0000024BA2658BF8> print(Car.cul) # <function Car.cul at 0x0000024BA2658BF8>
3. 类方法
都是方法
print(c.jump) # <bound method Car.jump of <class '__main__.Car'>> print(Car.jump) # <bound method Car.jump of <class '__main__.Car'>>
c = Car() print(isinstance(c.run, FunctionType)) # False print(isinstance(Car.run, FunctionType)) # True print(isinstance(c.run, MethodType)) # True print(isinstance(Car.run, MethodType)) # False # 静态方法 都是函数 print(isinstance(c.cul, FunctionType)) # True print(isinstance(Car.cul, FunctionType)) # True print(isinstance(c.cul, MethodType)) # False print(isinstance(Car.cul, MethodType)) # False # 类方法都是方法 print(isinstance(c.jump, FunctionType)) # False print(isinstance(Car.jump, FunctionType)) # False print(isinstance(c.jump, MethodType)) # True print(isinstance(Car.jump, MethodType)) # True # FunctionType:函数 # MethodType: 方法
3. 反射(重点)
hasattr(对象, 属性(字符串))
getattr(对象, 属性(字符串)) 从对象中获取到xxx属性
setattr(对象, 属性, 值)
delattr(对象, 属性) 从对象中删除xxx属性
4. md5加密
import hashlib
obj = hashlib.md5(加盐)
obj.update(铭文的bytes)
obj.hexdigest() 获取密文
import hashlib SALT = b"abcdefghijklmnjklsfdafjklsdjfklsjdak" #bytes类型 常量 # # 创建md5的对象 obj = hashlib.md5(SALT) # 加盐 # 给obj设置铭文 obj.update("alex".encode("utf-8")) # 转换bytes类型 # 获取到密文 miwen = obj.hexdigest() # 16进制 加盐之后效果, 可防止撞库 f4c17d1de5723a61286172fd4df5cb83 print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f # md5使用 def jiami(content): obj = hashlib.md5(SALT) obj.update(content.encode("utf-8")) return obj.hexdigest() # 注意加括号 # 注册 username = input("请输入你的用户名:") # alex password = input("请输入你的密码:") password = jiami(password) # c3d4fe3dce88533a8b50cf2e9387c66d print(password) uname = "alex" upwd = "c3d4fe3dce88533a8b50cf2e9387c66d" # 登陆 username = input("请输入你的用户名:") password = input("请输入你的密码:") if uname == username and upwd == jiami(password): print("登录成功") else: print("失败")