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是所有类的根. 面向对象的祖宗
View Code
type 获取到xxx对象的类型
class Animal:
pass
class Cat(Animal):
pass
c = Cat()
print(type(c)) # 可以精准的返回数据类型
View Code
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, "胡辣汤"))
View Code
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>
View Code
2. 静态方法
都是函数
print(c.cul) # <function Car.cul at 0x0000024BA2658BF8>
print(Car.cul) # <function Car.cul at 0x0000024BA2658BF8>
View Code
3. 类方法
都是方法
print(c.jump) # <bound method Car.jump of <class '__main__.Car'>>
print(Car.jump) # <bound method Car.jump of <class '__main__.Car'>>
View Code
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: 方法
View Code
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("失败")
View Code