内容梗概:
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. Python基础部分:9、数据的类型和内置方法

    目录 一.数据类型内置方法理论 1.什么是数据内置方法 2.如何调用数据内置方法 二.整型(int)内置方法与操作 1.类型转换 2.进制数转换 三.浮点型(float)内置方法与操作 1.类型转换 ...

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

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

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

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

  4. Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理

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

  5. Python之路(第二十六篇) 面向对象进阶:内置方法

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

  6. python学习番外篇——字符串的数据类型转换及内置方法

    目录 字符串的数据类型转换及内置方法 类型转换 内置方法 优先掌握的方法 需要掌握的方法 strip, lstrip, rstrip lower, upper, islower, isupper 插入 ...

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

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

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

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

  9. Python基础之反射

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

随机推荐

  1. npm的安装和使用?

    参考: http://www.cnblogs.com/chyingp/p/npm.html 在css中使用变量, 采用less或sass来编译css 改变网页网站开发和构建的方式, 除了用emmet( ...

  2. <Python>判断变量是否是DataFrame 或者 Series

    https://stackoverflow.com/questions/14808945/check-if-variable-is-dataframe Use the built-in isinsta ...

  3. UVA 10318 Security Panel(DFS剪枝 + 状压 + 思维)题解

    题意:给一个r*c的矩阵开关(初始全打开的),每次按下一个开关都会改变3*3范围内的有*的地方的状态,问你最少几步能让开关全闭上,按升序输出按哪些按钮 思路:每个按钮至多按一下,按按钮的顺序和结果无关 ...

  4. phpcms9-6-0 一键getshell工具

    介绍 一键化python 1.py http://xxx.com,如果是批量直接运行py文件即可 待办 [] 加入对有验证码phpcms网站的支持 [] 加入批量(已完成) 说明 依赖库的安装pip ...

  5. Docker3之Swarm

    Make sure you have published the friendlyhello image you created by pushing it to a registry. We’ll ...

  6. VHDL 乐曲演奏电路设计

    前言 无源蜂鸣器在直流信号下不会响,需要方波驱动.输入不同频率的方波会发出不同音调的声音,方波的幅值决定了声音的响度. 目标 乐曲发生电路在节拍(4Hz)的控制下根据乐谱产生合适的分频系数.分频器根据 ...

  7. HDU 4825 Xor Sum(01字典树入门题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4825 题意: 给出一些数,然后给出多个询问,每个询问要从之前给出的数中选择异或起来后值最大的数. 思路:将给出的 ...

  8. File操作-将txt里的内容写入到数据库表

    package com.Cristin.File;//将txt里的内容写入到数据库表 import com.Cristin.MySQL.AddDataToDB;import org.testng.an ...

  9. 常见字符集&乱码问题

    字符集 常用字符集分类 ASCII及其扩展字符集 作用:表语英语及西欧语言. 位数:ASCII是用7位表示的,能表示128个字符:其扩展使用8位表示,表示256个字符. 范围:ASCII从00到7F, ...

  10. 随机--相关(Fisher_Yates算法)

    Fisher_Yates算法   void ShuffleArray_Fisher_Yates(char* arr, int len) {     int i = len, j;     char t ...