一、昨日内容回顾

  类与类之间的关系

    1、依赖关系。通过参数的传递把另外的一个类的对象传递进来

    2、关联关系,组合,聚合。  通过属性设置来维护两个对象的关系

      def __init__():

        self.stuList = []

      def __init__():

        self.teacher = teacher

    3、关于继承

      self : 谁调用的,self就是谁

    4、特殊成员

      __init__()  初使化方法

      __new__()  构造方法

      __call__()  对象()

      __add__()  +

      __getitem__  对象[]

      __setitem__  对象[] = 值

      __delitem__  del 对象[]

      __del__  del 对象  析构函数

      __len__  len(对象)

      __iter__  for. iter()

      __next__  next()

      __dir__  dir()

      __getslice__  对象[::]

      __hash__  hash()

      __class__

      __dict__  查看当前对象的属性

二、isinstance , type , issubclass

   1、 issubclass :这个内置函数可以帮我们判断xxx类是否是 yyy类型的子类
     

class Base:pass
class Foo(Base):passclass Bar(Foo):passprint(issubclass(Bar, Foo))     # True
print(issubclass(Bar, Base))    # False
print(issubclass(Foo, Bar))     # True

View Code

  2、type:   type(obj)  表示obj是由哪个类创建的 ---- 用法一
class Foo:passobj = Foo()
# 查看对象 obj由哪个类创建
print(obj , type(obj))  # <__main__.Foo object at 0x0000029B31A17080> <class '__main__.Foo'>
type还可以帮我们判断 xxx 是否是 xxx 数据类型的 ---- 用法二class Boy:passclass Girl:pass
# 统计传进来的男女生数量分别是多少def func(*args):b, g = 0, 0for obj in args:if type(obj) == Boy:b += 1elif type(obj) == Girl:g += 1return b , gret = func(Boy(),Girl(),Girl(),Girl(),Girl(),Boy(),Boy(),Boy(),Boy())
print(ret)      # (5, 4)

  在进行计算时,先判断好要计算的数据类型必须是 int 或者 float ----用法三
def add(a, b):if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):return a + belse:print("我要报错")

3、isinstance   它也可以判断xxx是yyy类型的数据,但是 instance没有type那么精准
class Base:passclass Foo(Base):passclass Bar(Foo):passprint(isinstance(Foo(), Foo))  # True
print(isinstance(Foo(), Base))  # True
print(isinstance(Bar(), Base))  # True
print(isinstance(Foo(), Bar))   # False

  isinstance 可以判断该对象是否是xxx家族体系中的(只能网上判断)

三、区分函数的方法
    1、一般情况下 直接打印一下,就能区分是函数还是方法(特殊情况下不准确)  
def func():passprint(func)   # <function func at 0x000002C283502E18>class Foo:def chi(self):print("我是吃")
f = Foo()
print(f.chi)   # <bound method Foo.chi of <__main__.Foo object at 0x0000021DD6227320>>


  函数在打印的时候,很明显的显示的是function, 而方法在打印的时候很明显是method其实,并不一定是这样的。如:
class Foo():def chi(self):print("我是吃")@staticmethoddef static_method():pass@classmethoddef class_method(cls):pass
f = Foo()
print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x00000284EC6E7320>>print(Foo.chi) # <function Foo.chi at 0x000001C8CC0288C8>print(Foo.static_method) #<function Foo.static_method at 0x0000028079048950>print(Foo.class_method) # <bound method Foo.class_method of <class '__main__.Foo'>>print(f.static_method) # <function Foo.static_method at 0x00000272AF6E8950>print(f.class_method) #  bound method Foo.class_method of <class '__main__.Foo'>>

仔细观察,我们能得到以下结论:   1)、类方法,不论任何情况,都是方法   2)、静态方法,不论何种情况,都是函数   3)、实例方法,如果是实例方法,则是方法;如果是类访问,则是函数

2、在程序里如何分辨是函数函还是方法呢?

所有的方法都MethodType的实例所有的函数都是FunctionType的实例
from types import MethodType,FunctionTypedef func():passprint(isinstance(func, FunctionType)) # True
print(isinstance(func, MethodType))     # Falseclass Foo:def chi(self):print("我要吃")@staticmethoddef static_method():pass@classmethoddef class_method(cls):passobj = Foo()
print(type(obj.chi)) # method
print(type(Foo.chi)) # function
print(isinstance(obj.chi, MethodType)) # True
print(isinstance(Foo.chi, FunctionType)) # Trueprint(isinstance(Foo.static_method, FunctionType)) # True
print(isinstance(Foo.static_method, MethodType)) # Falseprint(isinstance(Foo.class_method, FunctionType)) # False
print(isinstance(Foo.class_method, MethodType)) # True

四、反射

      首先我们来看一个这样的需求,有个大牛,写了一堆特别牛逼的代码,然后放在了py文件里(模块)    这时,想要用大牛写的东西,但是,首先得直到大牛写的这些代码都是干什么用的。那就需要把每个函数    跑一下。
DN.pydef chi():print("大牛特别能吃")def he():print("大牛特别能喝")def la():print("大牛一次啦三斤")def sa():print("大牛一次撒几吨")接下来错误的示例:这样的写法非常的low,假如有100个函数,这个代码就非常恐怖import DNwhile 1:print("""作为大牛,我帮你写了:chihelasa等功能,自己看看吧""")func = input("输入你想要测试的功能:")if func == "he":DN.chi()elif func == "chi":DN.chi()。。。。。。正确的打开姿势:import DNwhile 1:print("""作为⼤⽜, 我帮你写了:chihelashui
等功能. ⾃⼰看看吧""")gn = input("请输⼊你要测试的功能:")# niuB版func = getattr(DN, gn)func()getattr(对象,字符串):从对象中获取到xxx功能。此时xxx是一个字符串。get表示找 attr表示属性(功能)。但是这里有个问题,假如手一抖,输入错了,在大牛的代码里没有找到想要的内容,那么这个时候就会报错。所以在getattr之前,要先判断有没有import DN
from types import FunctionType
while 1:print("""作为⼤⽜, 我帮你写了:chihelashui
等功能. ⾃⼰看看吧""")gn = input("请输⼊你要测试的功能:")# niuB版if hasattr(DN, gn): # 如果master⾥⾯有你要的功能# 获取这个功能, 并执⾏attr = getattr(DN, gn)# 判断是否是函数. 只有函数才可以被调⽤if isinstance(attr, FunctionType):attr()else:# 如果不是函数, 就打印print(attr)

总结:getattr可以从模块中获取内容,在python中一切皆为对象。那可以这样认为。getattr()    从对象中动态的获取内容

补充:    关于反射,其实一共有4个函数:    1、hasattr(obj, str) 判断obj中是否包含str成员    2、getattr(obj, str) 从obj中获取 str成员    3、setattr(obj,str,value) 把obj中的str成员设置成value。注意,这里的value        可以是值,也可以是函数或者方法    4、defattr(obj, str) 把obj中的str成员删掉    注意:以上的操作都是在内存中进行的,并不会影响源代码
class Foo:pass
f = Foo()print(hasattr(f, "chi")) # False

setattr(f, "chi", "123")print(f.chi) # 被添加了⼀个属性信息

setattr(f, "chi", lambda x: x + 1)
print(f.chi(3)) # 4print(f.chi) # 此时的chi既不是静态⽅法, 也不是实例⽅法, 更不是类⽅法. 就相当于你在类中
# 写了个self.chi = lambda 是⼀样的
print(f.__dict__) # {'chi': <function <lambda> at 0x107f28e18>}
delattr(f, "chi")
print(hasattr(f, "chi")) # False

五、MD5 加密

   1、md5特点:不可逆的一种加密方式,最多用在密码加密上

   2、实例:
import hashlib# 创建md5的对象
obj = hashlib.md5()
# 给obj设置明文
obj.update("alex".encode("utf-8"))  # update传入多的内容需为byte类型
# 获取密文
result = obj.hexdigest()  # haxdigest  hax是16进制,digest是摘要
print(result)   # 534b44a19bf18d20b71ecc4eb77c572f

  

3、以上为粗略的md5小试,此方法产生的密文容易被撞库破解,下面的是改进版
import hashlibSALT = b"alex"     # 加盐  此方法可有效的防止被撞库

obj = hashlib.md5(SALT)
obj.update("alex".encode("utf-8"))
result = obj.hexdigest()
print(result)    # 0bf4375c81978b29d0f546a1e9cd6412# # md5 的整理使用
def md5_method(content):obj = hashlib.md5(SALT)obj.update(content.encode("utf-8"))return obj.hexdigest()#    4、 MD5的应用# 注册     # alex   123  ---》 b75bd008d5fecb1f50cf026532e8ae67
username = input("用户名:")
password = input("密码:")
password = md5_method(password)# 登录
uname = input("用户名:")
pwd = input("密码:")
if md5_method(pwd) == password and uname == username:print("登录成功")
else:print("失败")


转载于:https://www.cnblogs.com/alvin-jie/p/9936225.html

python之路-day18-反射相关推荐

  1. 初学python之路-day18

    time时间模块 时间戳(timestamp):time.time() 延迟线程的运行:time.sleep(secs) (指定时间戳下的)当前时区时间:time.localtime([secs]) ...

  2. Python学习路程day18

    Python之路,Day18 - Django适当进阶篇 本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣和效 ...

  3. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关 Python之路[第五篇]:面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance ...

  4. Python之路【第十六篇】:Django【基础篇】

    https://www.cnblogs.com/wupeiqi/articles/5237704.html Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django ...

  5. python之路——模块和包

    一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编 ...

  6. python 之路,Day11 (下)- sqlalchemy ORM

    python 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 ...

  7. 《我的Python之路V1.3.pdf》可以下载了,这版pdf更精美!

    1 前言 Python之路V1.3.pdf,使用更加专业的latex脚本和专业的Tex Live编译器生成,在经过这周3,4天的学习,编写,制作,终于完成年前制定的计划. 在制作V1.3.pdf中,遇 ...

  8. Python之路【第十四篇】:AngularJS --暂无内容-待更新

    Python之路[第十四篇]:AngularJS --暂无内容-待更新 转载于:https://www.cnblogs.com/weiman3389/p/6224181.html

  9. Python之路【第一篇】:Python简介和入门

    Python之路[第一篇]:Python简介和入门 Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗 ...

  10. Python之路,day22-BBS基础

    Python之路,day22-BBS基础 多级评论 from django.template import Library from django.utils.safestring import ma ...

最新文章

  1. iOS 根据数组中的字典的value值进行排序
  2. webservice用完关闭连接_解决调用WebService报基础连接已经关闭: 服务器关闭了本应保持活动状态的连接的错误的方法...
  3. TypeScript学习笔记3:运算符
  4. python应声虫程序_Python编程基础
  5. Screen Painter 程序设计
  6. java 枚举可以循环吗_(转载)java 枚举 循环遍历以及一些简单常见的使用
  7. HTML5中volume样式自定义,html5中关于volume属性的使用详解
  8. MySQL 数据库“十宗罪”(十大经典错误案例)
  9. sql中的join问题
  10. background: radial-gradient径向渐变
  11. matlab定积分程序,[转载]Matlab数值积分程序集合【转载】
  12. 【音视频—基础】分辨率、码率和帧率
  13. python自动翻译pdf_python pdf一键翻译脚本
  14. 博士申请 | 美国匹兹堡大学高伟教授招收Mobile AI方向全奖博士生
  15. 含义:Web1.0、Web2.0、Web3.0、Web4.0、Web5.0、Web6.0
  16. 下一关口令:别犹“豫”,看“浙”里,一起“皖”
  17. PLSQL代码调试Oracle dbms_utility返回错误
  18. jQuery实现雪花飘落效果
  19. win10“网络属性”选项卡空白怎么办
  20. 面试:JavaScript基础概念

热门文章

  1. 计算机二级access选择题知识点总结,全国计算机二级Access考试重点题型汇总(选择题).doc...
  2. 大学期末考试综合实训试题一
  3. nginx屏蔽服务器类型信息,简单的禁止CURL 访问服务器nginx
  4. Pyppeteer库之四:Pyppeteer的页面操作(下)
  5. 服务端如何识别是selenium在访问以及解决方案参考一
  6. java调用C++ DLL库方法
  7. JDBC之一:JDBC快速入门
  8. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充
  9. golang 释放内存机制的探索
  10. 2013年大数据全球技术峰会观后感