日常的写在前面

难得的周末,有大段的时间可以用来学习,体验就和工作日的晚上完全不一样了。

好好的沉下心学习下~

即刻很喜欢了!

好好学习的分割线

打打打鸡血!!!!!!

面向对象高级编程

前天的定制类的__call__通过小佳扬的一语惊醒梦中人,就是把对象函数化了。

感觉有点囫囵吞枣,看完教程后要还好好地归纳下。

枚举类

定义常量时候使用,例如定义月份。

JAN = 1

FEB = 2

MAR = 3

...

NOV = 11

DEC = 12

但是此时的类型是int。

通过Python提供的Enum类来实现为枚举类型定义一个class类型。

from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

这样就获得了Month类型的枚举类,可以使用Month.Jan来引用一个常量,或者枚举成员。

for name, member in Month.__members__.items():

print(name, '=>', member, ',', member.value)

value属性是自动赋给成员的值,默认从1开始计数。

如果需要更精确地控制枚举类型,可以从Enum派生出自定义类。

from enum import Enum, unique

@unique

class Weekday(Enum):

Sun = 0 # Sun的value被设定为0

Mon = 1

Tue = 2

Wed = 3

Thu = 4

Fri = 5

Sat = 6

@unique装饰器可以帮助我们检查保证没有重复值。

使用元类

type()

动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。

type()函数可以查看类型或者变量的类型,class的类型就是type。

而且type()函数既可以返回一个对象的类型,又可以创建出新的类型。

#用type()函数创造出hello类

def fn(self, name='world'): # 先定义函数

print('Hello, %s.' % name)

Hello = type('Hello', (object,), dict(hello=fn))

用type()创建类,需要依次传入三个参数:

class的名称;

继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;

class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上

这样和直接定义class的写法没有差异,但是这样的话就可以在代码运行的过程中,动态创建类,这和静态语言有很大不同。

metaclass

除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass。

先定义metaclass,就可以创建类,最后创建实例。

据说很难理解的魔术代码,还是认真的努力理解下吧!

看下大牛的代码!

这个metaclass可以给我们自定义的MyList增加一个add方法:

定义ListMetaclass,按照默认习惯,metaclass的类名总是以Metaclass结尾,以便清楚地表示这是一个metaclass。

# metaclass是类的模板,所以必须从`type`类型派生:

class ListMetaclass(type):

def __new__(cls, name, bases, attrs):

attrs['add'] = lambda self, value: self.append(value)

return type.__new__(cls, name, bases, attrs)

有了ListMetaclass,我们在定义类的时候还要指示使用ListMetaclass来定制类,传入关键字参数metaclass:

class MyList(list, metaclass=ListMetaclass):

pass

这样MyList创建的时候,需要通过ListMetaclass.__new__()来创建。

__new__()方法接收到的参数依次是:

当前准备创建的类的对象;

类的名字;

类集成的父类集合;

类的方法集合。

而MyList()可以调用add方法,但普通list()就没有。

list即类的对象。

这个复杂的有点变态的定义方式,在一些场景下,例如ORM的编写中,会很有用。

ORM全称“Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。

这块有点复杂,虽然看懂了,但是还要好好琢磨下

错误、调试和测试

错误处理

高级语言都内置了一套try...except...finally...的错误处理机制,Python小可爱也有。

try

当有错误时候,会打断代码的进行,跳转到except处,一旦有finally的话就一定会执行,无论有没有发生错误。

可以有多个except获取不同的错误,但是注意父类和子类的问题,如果一旦包括了父类错误,子类所在的except就不会被执行。

except后也可以加else语句,当没有错误发生的时候,会执行else语句。

Python所有的错误都是从BaseException类派生的,常见的错误类型和继承关系有这些:

https://docs.python.org/3/lib...

也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦。

调用栈

如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。

所以找错误栈的时候,一定要找到准确的最里面那层。

错误记录

等Python解释器打印错误栈的信息,程序也结束了。

既然可以捕获,就在捕获的同时打印错误信息并分析原因,让程序继续下去。

Python内置的logging可以很容易的记录错误信息。

# err_logging.py

import logging

def foo(s):

return 10 / int(s)

def bar(s):

return foo(s) * 2

def main():

try:

bar('0')

except Exception as e:

logging.exception(e)

main()

print('END')

这样打印完错误信息后还会打印END,即运行了后续的代码。

将logging通过配置记录到日志文件中方便后续的排查。

抛出错误

捕获的错误其实是错误class的一个实例,错误也是需要定以后才能抛出然后被捕获到的。

如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例.

# err_raise.py

class FooError(ValueError):

pass

def foo(s):

n = int(s)

if n==0:

raise FooError('invalid value: %s' % s)

return 10 / n

foo('0')

另一种抛出错误的例子如下。

# err_reraise.py

def foo(s):

n = int(s)

if n==0:

raise ValueError('invalid value: %s' % s)

return 10 / n

def bar():

try:

foo('0')

except ValueError as e:

print('ValueError!')

raise #错误又被抛出

bar()

这种方式也很常见,在抛出问题后继续抛回上一级,由顶曾调用者进行处理。

raise语句如果不带参数,就会把当前错误原样抛出。

此外,在except中raise一个Error,还可以把一种类型的错误转化成另一种类型。

调试

用print()打印有问题的变量

麻烦在还得删掉或注释掉相应语句

断言

凡是可以用print打印的地方,都可以用asset断言来代替。

def foo(s):

n = int(s)

assert n != 0, 'n is zero!'#判断此处n!=0是否为True,如果非则抛出AssertionError

return 10 / n

def main():

foo('0')

可以在启动Python解释器的时候关闭assert

$python -0

logging

同样是替换print,logging不会抛出错误,而且可以输出到文件。

import logging

logging.basicConfig(level=logging.INFO)

s = '0'

n = int(s)

logging.info('n = %d' % n)

print(10 / n)

这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

pdb

启动Python的调试器pdb,让程序以单步方式运行。

pdb.set_trace()

这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点

python你好怎么写_小李飞刀:ppppppython你好哇相关推荐

  1. 简历python技能怎么写_简历怎么写?列出这10项重要的工作技能

    一份出色的简历能让你脱颖而出,获得面试机会,就好像你解决了拼图游戏,尤其是在技能部分.在当今这个时代,电脑算法更有可能在你的简历出现在人们眼前之前就对其进行了梳理,那么一个人怎么知道哪些工作技能是必须 ...

  2. python图片隐写_机窝安全--LSB图片隐写

    人类能说识别大概1000万中颜色,而BMP等的三原色有从0x00~0xFF,也就是有256的3次方,大概是1600多万,也就是说人类大概有600万颜色无法识别,但是机器并不是通过像素识别,而是通过该像 ...

  3. python图像隐写_在图像中隐藏数据:用 Python 来完成图像隐写术

    什么叫"隐写术"? 隐写术是将保密信息掩藏在更大的信息内容中,使他人没法了解掩藏信息内容的存有及其掩藏信息的全过程.隐写术的目地是确保彼此中间的商业秘密沟通交流.与掩藏保密信息內容 ...

  4. python模板怎么写_模板模式-Python

    这篇文章完全摘录自别人,等后续,基于自己在项目中的应用,再重新写一下. 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子 ...

  5. python笔记手写_手写笔记的压缩与增强

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 我写了一个程序来清洁手写笔记的扫描图,并同时减少文件大小. 示例输入输出: 左边: 300 DPI, 7. ...

  6. 简历python技能怎么写_用Python解析简历中的技能部分

    我试图用python解析简历的技能部分.我找到了Omkar Pathak先生的一个名为pyresparser的库,我能够将PDF简历的内容提取到简历.txt文件.在 然而,我在想,我怎么能只把简历中的 ...

  7. 自学python简历怎么写_自学Python1.1-简介

    1.python语言介绍 python的创始人:Guido Van Rossum 2.python是一门什么样的语言 2.1  编程语言主要从以下几个角度进行分类:编译型,静态型,动态性,强类型定义语 ...

  8. python多线程怎么写_怎么样优雅的使用python多线程?python进阶

    Python多线程类似于同时执行多个不同程序,但其执行过程中和进程还是有区别的,每个独立的线程有一个程序运行的入口.顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提 ...

  9. python图片隐写_基于python的LSB隐写与分析

    隐写 效果 隐写前 隐写后 灰度值直方图差别 部分源码 def dec_to_bin(dec): return '{:08b}'.format(dec) def bin_to_dec(binary_c ...

最新文章

  1. TiDB 源码阅读系列文章(十九)tikv-client(下)
  2. 【任务脚本】0523更新京东618叠蛋糕任务脚本全自动脚本,大神更新了京东任务全自动程序...
  3. Java多线程之线程并发库阻塞队列的应用
  4. 【NLP】GPT-3问世这一年,给世界带来的困扰与希望
  5. 深度学习和目标检测系列教程 1-300:什么是对象检测和常见的8 种基础目标检测算法
  6. 使用 CORBA 和 Java IDL
  7. 微信小程序点击按钮弹出弹窗_微信小程序实现的点击按钮 弹出底部上拉菜单功能示例...
  8. 安卓应用安全指南 4.4.2 创建/使用服务 规则书
  9. 模块化编程的分层设计经验
  10. java ffmpeg_jave (java的ffmpeg框架)简单使用
  11. 利用JavaScript完成页面定时弹出广告
  12. 【踩坑记录】.bss段;.bss段到底占不占目标文件的空间,有没有记录对应信息。
  13. 【ORA-RAC】ORA-15045: ASM file name '+DATA01' is not in reference form
  14. 华为防火墙双机热备(三层上下行交换机)
  15. Python被编进小学教材了?啥时纳入高考……
  16. 如何在达梦数据库安装ODBC
  17. 数字视频处理(五)——频率域陷波滤波
  18. TikTok涨粉?参考抖音?账号增粉解析!
  19. @WebFilter怎么控制多个filter的执行顺序
  20. 关于EF多线程更新数据的一个报错

热门文章

  1. 福禄克FLUKE LinkIQ智能链路通工业以太网线缆+ 网络测试仪 解决工业以太网故障的头号原因
  2. 期货方法(期货方法很简单 只用MACD)
  3. 后疫情时代,VR全景创业的应用场景有哪些?
  4. 软件测试-接口测试-知识点
  5. 原装苹果手机_二手原装正品苹果手机及平板批发报价单321
  6. UFSA扩大UFS生态系统,增加可移除式手机存储卡和相关技术的供应商
  7. Web3 身份九大方向及代表项目
  8. 使用fiddler抓包pc端微信小程序,相应报文总是出现乱码。decode用了也不行,regedit改了utf-8也没有用
  9. java GUI 好看的皮肤 mark jyloo.com
  10. 【PC工具】更新免费xx文库文档下载器工具