内容梗概:
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. HDU 4391 Paint The Wall(分块的区间维护)

    题意:给出几个操作,把l-r赋值为z,询问l-r有几个z,其中z < INT_MAX 思路:因为z很大,所以很难直接用线段树去维护.这里可以使用分块来解决.我们可以让每个块用map去储存map[ ...

  2. LightOJ 1151 Snakes and Ladders(概率DP + 高斯消元)

    题意:1~100的格子,有n个传送阵,一个把进入i的人瞬间传送到tp[i](可能传送到前面,也可能是后面),已知传送阵终点不会有另一个传送阵,1和100都不会有传送阵.每次走都需要掷一次骰子(1~6且 ...

  3. nginx的高可用集群

    1,阿里云:SLB 2, 硬件负载均衡器(如:F5,RedWare ) 3,软件实现高可用或负载均衡.keepalived

  4. computed 计算选项

    computed 的作用主要是对原数据进行改造输出.改造输出:包括格式的编辑,大小写转换,顺序重排,添加符号……. 格式化输出结果 我们先来做个读出价格的例子:我们读书的原始数据是price:100 ...

  5. 使用路由传参时,query与params的区别!

    query 1:参数会在地址栏显示 2:参数不需要在路由的path后接:args1/:args2 3:获取参数用this.$route.query.args1 params 1:参数需要在路由的pat ...

  6. 2-4、nginx特性及基础概念-nginx web服务配置详解

    Nginx Nginx:engine X 调用了libevent:高性能的网络库 epoll():基于事件驱动event的网络库文件 Nginx的特性: 模块化设计.较好扩展性(不支持模块动态装卸载, ...

  7. StringBuilder的三种删除方法比较

    分别用一千万次循环来比较StringBuilder的三种删除方法所用时间 未避免偶然性,再循环一百次来比较总时间 --主类 public class StringBuilderRemove { pub ...

  8. Navicat for MySQL用ssh功能连接远程数据库

    转载自:http://holy2010.blog.51cto.com/1086044/518431 实现用本地的ssh隧道起到加密功能 在windows平台上运行Navicat for MySQL(h ...

  9. hibernate的三种状态和缓存

    hibernate的三种状态: 1.瞬时态:对象里面没有id值,对象与session没有关联 类似,把class类new出来,不存进session 2.持久态:对象里面有id值,对象与session关 ...

  10. Python中cPickle

    cPickle模块: 在python中,一般可以使用pickle类来进行python对象序列化,而cPickle提供了一个更快速简单的接口,如python文档所说:“cPickle - A faste ...