python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用

时间:2023-02-23 11:30:58
内容梗概:
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内置方法的运用的更多相关文章

  1. 绑定与非绑定方法及反射,isinstance和issubclass内置函数

    目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...

  2. Python27天 反射 ,isinstance与ssubclass 内置方法

    所学内容 反射 1.hasattr ( 判断一个属性在对象里有没有 ) -------------------- [对象,字符串属性]本质是:# 判断 ' name ' in obj.__dict__ ...

  3. Python之路&lpar;第二十九篇&rpar; 面向对象进阶:内置方法补充、异常处理

    一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...

  4. Python之路&lpar;第二十六篇&rpar; 面向对象进阶:内置方法

    一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...

  5. python基础-requests模块、异常处理、Django部署、内置函数、网络编程

     网络编程 urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应. 校验返回值,进行接口测试: 编码:把一个Python对象编码转 ...

  6. python基础之生成器表达式形式、面向过程编程、内置函数部分

    生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...

  7. Python基础之反射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

  8. python基础-9&lowbar;&lowbar;import&lowbar;&lowbar; 反射和面向对象基础 self 封装 继承(多继承顺序) 多态

    一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  9. python 入门基础21 --面向对象&lowbar;多态、内置方法、反射

    内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...

随机推荐

  1. find&lowbar;elements后点击不了抓取的元素

    1.莫名其妙抓不到元素,要去看句柄,是不是没有切换 h=driver.current_window_handle nh=driver.window_handles for i in nh: if i! ...

  2. &lbrack;skill&rsqb;&lbrack;gdb&rsqb; gdb 多线程调试

    中文快速入门: http://coolshell.cn/articles/3643.html (关于多线程的部署说的并不太对) 进阶: 多进程相关概念: inferiors 是什么? http://m ...

  3. 搭建maven项目简介

    http://jingyan.baidu.com/album/9f7e7ec0b714ae6f29155465.html?picindex=1 Maven学习 (一) 搭建Maven环境 http:/ ...

  4. jQuery自学笔记(四):jQuery DOM节点操作

    获得和设置内容:text( ).html( ) 以及 val( ) text( ) - 设置或返回所选元素的文本内容 html( ) - 设置或返回所选元素的内容(包括 HTML 标记) val( ) ...

  5. mysql group&lowbar;concat函数是有长度限制的

    在表关联查询中,特别是一对多关系的表查询中,group_concat函数是很有用的一个函数,帮助我们减少对数据库查询的次数,减少服务器的压力. 但是今天使用group_concat函数查询数据库时,发 ...

  6. 设计模式:基于线程池的并发Visitor模式

    1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...

  7. 从 MVC 到前后端分离

    从 MVC 到前后端分离 1 理解 MVC MVC 是一种经典的设计模式,全名为 Model-View-Controller,即 模型-视图-控制器. 其中,模型 是用于封装数据的载体,例如,在 Ja ...

  8. javascript语言扩展&colon;可迭代对象(4)

    js 1.7中还包含一个数组推导(array comprehension)的特性,如果不在最后介绍它好像显得不怎么完整. 数组推导其实很简单: let a = [x*x for(x in range( ...

  9. poj3468 A Simple Problem with Integers(线段树区间更新)

    https://vjudge.net/problem/POJ-3468 线段树区间更新(lazy数组)模板题 #include<iostream> #include<cstdio&g ...

  10. Java面试总结(集合、spring)

    Java 集合框架简介 Java Collections Framework,最开始也是一个开源框架,后来被收录到JDK中 所谓的集合,就是能存放多个数据元素的容器,在Java中原生的容器是数组 数组 ...