python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用
内容梗概:
1. isinstance, type, issubclass
2. 区分函数和方法
3. 反射(重点)
4. md5加密 1. isinstance, type, issubclass
1.1 issubclass() 这个内置函数可以帮我们判断xxx类是否是yyy类型的子类.
class Base:
pass
class Foo(Base):
pass
class Bar(Foo):
pass
print(issubclass(Bar,Foo)) #True
print(issubclass(Bar,Base)) #True 可以隔代判断
print(issubclass(Foo,Bar)) #False print(issubclass(Foo, object)) #True
print(issubclass(Bar, object)) #True
print(issubclass(FooBar, object)) #True object是所有类的根. 面向对象的祖宗 1.2 type
定义:type(obj) 表⽰查看obj是由哪个类创建的
class Foo:
pass
obj = Foo()
print(obj, type(obj)) # 查看obj的类 可以精准的返回数据类型 实例二:判断男女并统计
class Boy:
pass
class Girl:
pass
统计传进来的男生和女生分别有多少
def func(*args):
b = 0
g = 0
for obj in args:
if type(obj) == Boy:
b += 1
elif type(obj) == Girl:
g += 1
return b, g
ret = func(Boy(), Girl(), Girl(), Girl(), Boy(), Boy(), Girl())
print(ret) 1.3 isinstance
作用:isinstance也可以判断xxx是yyy类型的数据. 但是isinstance没有type那么精准.
class Animal:
pass
class Cat(Animal): # x是一种y. x继承y
pass
class BosiCat(Cat):
pass
kitty = Cat()
kate = BosiCat()
print(isinstance(kitty, BosiCat)) # False kitty是cat,但不一定是BosiCat
print(isinstance(kate,Cat)) # True kate是BosiCat,所以一定是Cat tips:type的精确性更高,实例如下
print(type(kitty) == Animal) # False
print(isinstance(kitty, Animal)) # True 2. 区分函数和方法
2.1 区分方法一(野路子) 直接print()打印看结果
class Car:
def run(self): # 实例方法
print("我是车, 我会跑")
@staticmethod
def cul():
print("我会计算")
@classmethod
def jump(cls):
print("我会jump") 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>
实例方法:
1. 用对象.方法 方法
2. 类名.方法 函数 静态方法都是函数
print(c.cul) # <function Car.cul at 0x0000024BA2658BF8>
print(Car.cul) # <function Car.cul at 0x0000024BA2658BF8> 类方法都是方法
print(c.jump) # <bound method Car.jump of <class '__main__.Car'>>
print(Car.jump) # <bound method Car.jump of <class '__main__.Car'>> 2.2 用MethodType,FunctionType判断是函数还是方法(官方版)
from types import MethodType,FunctionType
实例方法:
print(isinstance(c.run,MethodType)) #True
print(isinstance(Car.run,MethodType)) #False
print(isinstance(c.run,FunctionType)) #False
print(isinstance(Car.run,FunctionType)) #True 静态方法:
print(isinstance(c.cul,MethodType)) #False
print(isinstance(Car.cul,MethodType)) #False
print(isinstance(c.cul,FunctionType)) #True
print(isinstance(Car.cul,FunctionType)) #True 类方法:
print(isinstance(c.jump,MethodType)) #True
print(isinstance(Car.jump,MethodType)) #True
print(isinstance(c.jump,FunctionType)) #False
print(isinstance(Car.jump,FunctionType)) #False 总结:
1. 类方法. 不论任何情况, 都是方法.
2. 静态方法, 不论任何情况. 都是函数
3. 实例方法, 如果是实例访问. 就是方法. 如果是类名访问就是函数. 3 反射.
关于反射, 其实一共有4个函数:
1. hasattr(obj, str)判断obj中是否包含str成员
2. getattr(obj,str)从obj中获取str成员
3. setattr(obj, str, value)把obj中的str成员设置成value.注意.这里的value可以是值,也可以是函数或方法
4. delattr(obj, str)把obj中的str成员删除掉
注意,以上操作都是在内存中进行的.并不会影响你的源代码 import master
def hei()
print("大牛不行,吃得少")
print(getattr(master,"name")) #获取master中的属性
setattr(master,"chi",hei) #更改master中chi的内容
setattr(master,"haha",hei) #若master无此内容,则会创建一个新内容
setattr(master,"name","张全蛋") #更改master中name的内容
setattr(master,"hehe","张全蛋") #若master无此内容,则会创建一个新属性
print(master.name)
print(master.haha) while 1:
s = input("请输入你要测试的功能名字:")
if hasattr(master,s): #判断master中是否含有该内容
fn = getattr(master,s)
fn()
else:
print("滚犊子") 实例二
class Car:
def __init__(self, color, pai, price):
self.color = color
self.pai = pai
self.price = price def fly(self):
print("我的车会飞") c = Car("黄色", "兰博基尼", 188888)
删除属性和方法
delattr(Car, "fly") # 可以操纵我们的类或者对象
c.fly() # 会报错,因为已经被删掉了 'Car' object has no attribute 'fly' 更该方法:
setattr(Car, "fly", lambda self:print("我的天啊. 我的车居然会飞"))
c.fly() 更改属性
print(c.color)
setattr(c, 'color', "黑色")
print(c.color) print(getattr(c, "pai"))
print(c.pai) 4.md5加密
md5特点: 不可逆的一种加密方式,#最多用在密码加密上 大致流程如下:
import hashlib
SALT = b"abcdefghijklmnjklsfdafjklsdjfklsjdak" #盐 变相二次加密,防止库匹配
创建md5的对象
obj = hashlib.md5(SALT) # 加盐
给obj设置铭文
obj.update("alex".encode("utf-8"))
获取到密文
miwen = obj.hexdigest()
f4c17d1de5723a61286172fd4df5cb83(加盐后)
print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f (未加盐前) 实例:
uname = "alex"
upwd = "3b74435096910f0ca102a3bde0b7b963" import hashlib
SALT = b"abcdefghijklmnjklsfdafjklsdjfklsjdak" def jiami(content):
obj = hashlib.md5(SALT)
obj.update(content.encode("utf-8"))
return obj.hexdigest() 注册
username = input("请输入你的用户名:") # alex
password = input("请输入你的密码:")
password = jiami(password) # 3b74435096910f0ca102a3bde0b7b963
print(password) 登录
username = input("请输入你的用户名:")
password = input("请输入你的密码:") if uname == username and upwd == jiami(password):
print("登录成功")
else:
print("失败")
python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用的更多相关文章
- Python基础部分:9、数据的类型和内置方法
目录 一.数据类型内置方法理论 1.什么是数据内置方法 2.如何调用数据内置方法 二.整型(int)内置方法与操作 1.类型转换 2.进制数转换 三.浮点型(float)内置方法与操作 1.类型转换 ...
- 绑定与非绑定方法及反射,isinstance和issubclass内置函数
目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...
- Python27天 反射 ,isinstance与ssubclass 内置方法
所学内容 反射 1.hasattr ( 判断一个属性在对象里有没有 ) -------------------- [对象,字符串属性]本质是:# 判断 ' name ' in obj.__dict__ ...
- Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理
一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...
- Python之路(第二十六篇) 面向对象进阶:内置方法
一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...
- python学习番外篇——字符串的数据类型转换及内置方法
目录 字符串的数据类型转换及内置方法 类型转换 内置方法 优先掌握的方法 需要掌握的方法 strip, lstrip, rstrip lower, upper, islower, isupper 插入 ...
- python基础-requests模块、异常处理、Django部署、内置函数、网络编程
网络编程 urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应. 校验返回值,进行接口测试: 编码:把一个Python对象编码转 ...
- python基础之生成器表达式形式、面向过程编程、内置函数部分
生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...
- Python基础之反射
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
随机推荐
- Intellij IDEA 安装配置Gradle
1.安装 到官网链接下载最新的bin版本,解压到 D:\Program Files (x86)\JetBrains\IDEA Configuration And Cache\gradle 配置环境变量 ...
- fw-cloud-framework项目配置、启动问题
1.config组件:其配置优先级高于每个注册到同一个中心的工程的本地配置,所以在统一以dev这个 profile启动各个项目时,去config中心中找-dev结尾的各个工程名命名的文件. confi ...
- IDEA引入Gradle工程小记
1.首先IDEA要在该工程Settings中配置本地安装的Gradle,配好其home目录,注意目录到根目录即可,不要到bin一级,否则提示错误,无法使用: 2.配置好后会自动侦测Gradle项目,点 ...
- oracle 之 如何链接别人电脑的oracle
1.首先确保两台电脑是在同一个局域网内,可以通过cm命令窗口 ping 对方电脑的ID,若是没问题则表示可以连接 2.接下来通过配置来首先连接对方的电脑 其实在后面还有一个是否创建新的额服务名的操作, ...
- Latex: extra alignment tab has been changed to cr
参考: Error: extra alignment tab has been changed to \cr Latex: extra alignment tab has been changed t ...
- JavaScript——语法与数据类型
严格模式 ECMA5引入了严格模式的概念.严格模式是为JavaScript定义了一种不同的解析与执行模型.在严格模式下,ECMA3中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误.要 ...
- Select2 添加默认值
折腾很久才解决问题 $.ajax({ url: '@Url.Action("GetSystemSzzdItem", "CangpinGushi")', type ...
- 如何终止线程的运行(C/C++)
想要终止线程的运行,可以使用以下方法: 1.线程函数返回(最好使用该方法). 2.通过调用ExitThread函数,线程将自行撤消(最好不使用该方法). 3.同一个进程或另一个进程中的线程调用Term ...
- 转youhu科技的文章 勿怪 感激 感激
资源加载 资源加载是加载模块中最为耗时的部分,其CPU开销在Unity引擎中主要体现在Loading.UpdatePreloading和Loading.ReadObject两项中,相信经常查看Prof ...
- ROC与AUC原理
来自:https://blog.csdn.net/shenxiaoming77/article/details/72627882 来自:https://blog.csdn.net/u010705209 ...