本文主要是介绍【011】Python全栈日记-脱发知识点合集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、常用魔术方法
1.init
初始化魔术方法
触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)
参数:至少有一个self,接收对象
返回值:无
作用:初始化对象的成员
注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有
结果:
2.new
实例化魔术方法
触发时机: 在实例化对时触发
参数:至少一个cls 接收当前类
返回值:必须返回一个对象实例
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
没事别碰这个魔术方法,先触发__new__才会触发__init__
a、首先调用__new__得到一个对象
b、调用__init__为对象添加属性
c、将对象赋值给变量
结果:
3.str
触发时机:使用print(对象)或者str(对象)的时候触发
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
注意:无
a本是一个实列对象,却作为一个字符串输出,如果没有魔方__str__是无法实现的。
结果:
4、add()
当传入加法时,调用。被加数为other
结果:
- del()
触发时机:删除对象成员时触发
参数:一个当前对象的self
返回值:无
作用:可以在删除成员时进行验证。
结果:
当我们删除del a ,del b,del c,还会触发么?
结果:
你会发现还是触发了__del__(),这是因为当你自己写的时候是你主动触发,而不写是计算机程序在函数(方法)运行完后会自动回收没用的参数,减少内存占用。
6.slots
限制传入的对象属性,写哪个允许哪个传入。(不知道有个卵子用,自己限制自己么)
使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的:
结果:
由于没允许age传入,所以类A找不到age这个属性,所以报错。
7、cell()
当对象当作函数时,调用__call__
结果:
8、类的专有方法:
init : 构造函数,在生成对象时调用
del : 析构函数,释放对象时使用
repr : 打印,转换
setitem : 按照索引赋值
getitem: 按照索引获取值
len: 获得长度
cmp: 比较运算
call: 函数调用
add: 加运算
sub: 减运算
mul: 乘运算
div: 除运算
mod: 求余运算
pow: 乘方
二、@ property、@self.setter
在设置属性时,如果我们直接把属性值暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把属性值随便改,这显然不合逻辑。
有没有一种既能检查参数,又可以用直接改变属性的方式来访问类的变量呢?
Python内置的@property和@self.setter装饰器就是负责把一个方法变成属性调用的:
看一个例子:
@property就是告诉你下面这个方法,是可以当成属性使用的,所以有a.age = 18,而方法age自身并没有除了self以外的参数。
@age.setter 就是当你使用age属性时,必须先经过@age.setter下的方法,对age进行设置。
上面的例子,如果输入年龄大于100或者小于0,这明显不符合逻辑,就会对年龄进行限制
输出结果:
从输出的结果我们也能看出来,设置age属性等于18后,先传入@age.setter进行检查,所以首先输出2,确认无误后赋值给新的属性_age(加下划线只是为了区分age和_age),然后传递到@propertry下的方法,所以输出1,返回_age的值给a.age 输出18。
三、设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性
工厂模式
设计模式涉及到创建类的几种模式,共同的也是最根本的原则就是:不要new对象!!!既然如此,告诉我你最先想到的是如何得到对象呢?没错,“你不让我new,那你给我个get对象的工具吧,别的我不管”。这就是工厂模式,工厂模式是一种简单又实用的模式,在各大框架到处可见,比如Java世界大名鼎鼎的spring,其本身就是一个大工厂。
这个我也不太懂,老师就是介绍一下,举了这个例子。
四、抽象类
具有抽象方法的类就是抽象类。
抽象方法就是没有完成的方法。只有方法名称和参数,没有方法内容的方法。
作用:适合于领导指定开发规范及多人协作完成类。
Abc: abstract class 抽象类的缩写
抽象类的语法
五、迭代器
1、概述
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
比如用for或者while进行从0到100000000000遍历时,电脑会先把0到100000000000这些数先存在内存中,这会占用大量的内存。而使用迭代器,读取一个数存如内存一个,遍历下一个数就会抹除上一个数,占用内存始终很小。
2、可迭代对象
序列:字符串、列表、元组
非序列:字典、文件
3、创建迭代器对象
使用内建的工厂函数iter(iterable)可以获取迭代器对象:
结果:
要使用迭代器就得使用iter()选择要迭代的元素,例如例子中的b = iter(a),然后通过next(b)推动迭代。
For和while循环是你设置好,自动遍历,而迭代器属于踢一脚走一步。
如果不想每次踢着走,可以借助循环结构来帮你踢
六、生成器
1、什么是生成器
创建python迭代器的过程虽然强大,但是很多时候使用不方便。生成器是一个简单的方式来完成迭代。简单来说,Python的生成器是一个返回可以迭代对象的函数。
2、怎样创建生成器
在一个一般函数中使用yield关键字,可以实现一个最简单的生成器,此时这个函数变成一个生成器函数。yield与return返回相同的值,区别在于return返回后,函数状态终止,而yield会保存当前函数的执行状态,在返回后,函数又回到之前保存的状态继续执行。
3、生成器函数与一般函数的不同
一下是几点不同:
生成器函数包含一个或者多个yield
当调用生成器函数时,函数将返回一个对象,但是不会立刻向下执行
我们可以通过next()方法对对象进行迭代
一旦函数被yield,函数会暂停,控制权返回调用者
局部变量和它们的状态会被保存,直到下一次调用
函数终止的时候,StopIteraion会被自动抛出(就是超出范围就会报错)
举例:
结果:
解释太难了,两种方法,第一使用pycharm带的debug来看程序运行流程,
第二种看我这张糙图理解一下:
红色是开头:调用函数,进入循环,输出第一次n=1,然后运行到yield暂停。
橙色:跳出循环,执行第一个print(next(b)),输出1,然后跳回循环的yield位置,继续往下输出第二次n=1,然后n+1,回到循环头。
黄色,输出第一次n=2,然后运行到yield暂停,跳出循环,到第二个print(next(b)),输出2,然后跳回循环的yield位置。
以此类推…………
4、生成器的表达式
我们之前学过列表解析
#产生1,2,3,4,5的一个列表
a = [x for x in range(5)]
然后就会把0到4遍历出来。
如果换成[]换成(),那么会成为生成器的表达式。
(x for x in range(5))
具体使用方式:
结果:
5、为什么使用生成器
- 更容易使用,代码量较小
- 内存使用更加高效。比如列表是在建立的时候就分配所有的内存空间,而生成器仅仅是需要的时候才使用,更像一个记录
- 代表了一个无限的流。如果我们要读取并使用的内容远远超过内存,但是需要对所有的流中的内容进行处理,那么生成器是一个很好的选择,比如可以让生成器返回当前的处理状态,由于它可以保存状态,那么下一次直接处理即可。
七、装饰器
我自己懂,说不明白啊,
所以我找了网上好多的关于装饰器的教程,有一个简单明了深得我心,原文链接:https://www.yiibai.com/python/decorator.html,接下来我引用他的教学过程,给大家讲一下装饰器。
1、装饰器是啥
装饰器,是给现有代码添加功能的一个功能。这也称为元编程,作为程序的一部分,尝试在编译时修改程序的另一部分。装饰器接收一个功能,添加一些功能并返回。
2、引入
为了了解装饰器,我们首先在Python中了解一些基本的东西。Python中的一切(是的,甚至是类)都是对象。 我们定义的名称只是绑定到这些对象的标识符。 函数也不例外,它们也是对象(带有属性)。 各种不同的名称可以绑定到同一个功能对象。
看一个例子:
答案是输出两个hello
当运行代码时,first和second函数都提供相同的输出。 这里名称first和second引用相同的函数对象。函数可以作为参数传递给另一个函数。将其他函数作为参数的函数也称为高阶函数。下面是这样子的一个函数的例子。
输出结果为:
4
2
此外,一个函数可以返回另一个函数:
结果:
Hello
这里,b是一个定义的嵌套函数,在每次调用a时返回。
3、装饰器
实际上,实现魔术方法__call__()的任何对象都被称为可调用。 因此,在最基本的意义上,装饰器是可调用的,并且可以返回可调用。基本上,装饰器接收一个函数,添加一些函数并返回。
运行结果为:
在上面的例子中,make_pretty()是一个装饰器。 在分配步骤。
pretty = make_pretty(ordinary)
函数ordinary()得到了装饰,返回函数的名字:pretty。可以看到装饰函数为原始函数添加了一些新功能。这类似于包装礼物。 装饰器作为包装纸。 装饰物品的性质(里面的实际礼物)不会改变。 但现在看起来很漂亮(因为装饰了)。
一般来说,我们装饰一个函数并重新分配它,
ordinary = make_pretty(ordinary).
这是一个常见的结构,Python有一个简化的语法。
可以使用@符号和装饰器函数的名称,并将其放在要装饰的函数的定义之上。 例如:
上面代码相当于:
[1]用参数装饰函数
上面的装饰器很简单,只适用于没有任何参数的函数。 如果有函数要接受如下的参数怎么办?
该函数有两个参数a和b。 我们知道,如果将b的值设置为0并传递那么是会出错的。
现在使用一个装饰器来检查这个错误。
结果:
以这种方式就可以装饰函数的参数了。
应该会注意到,装饰器中嵌套的inner()函数的参数与其装饰的函数的参数是一样的。 考虑到这一点,现在可以让一般装饰器使用任何数量的参数。
在Python中,这个由function(* args,** kwargs)完成。 这样,args将是位置参数的元组,kwargs将是关键字参数的字典。这样的装饰器的例子将是。
*args **kwargs在函数那个日记里讲述过的,忘了的可以去瞅瞅。
[2] 在Python中链接装饰器
多个装饰器可以在Python中链接。
这就是说,一个函数可以用不同(或相同)装饰器多次装饰。只需将装饰器放置在所需函数之上。
结果:
以上语法:
相当于:
链装饰器的顺序是重要的。 所以如果把顺序颠倒了执行结果就不一样了,如下 :
结果就变成了:
八、闭包
闭包是函数式编程的重要的语法结构,Python也支持这一特性,下面就开始介绍Python中的闭包。
1、Python创建闭包
下面看一个闭包的简单的例子,例子中定义了一个可以配置打招呼的函数
”greeting_conf”,在这个函数中,内嵌了一个”greeting”的内嵌函数:
代码的结果为:
上面的代码有下面几个注意点:
- “greeting”函数访问了non-local的变量”prefix”,根据前面namespace的介绍,这点是完全合法的。
- 变量”prefix”并没有随着函数的退出而销毁,反而是生命周期得到了延长 下面看看为什么变量”prefix”生命周期得到了延长?
2、闭包和函数
闭包只是在表现形式上跟函数类似,但实际上不是函数。
结果:
从代码的结果中可以看到,闭包在运行时可以有多个实例,不同的引用环境(这里就是prefix变量)和相同的函数(这里就是greeting)组合可以产生不同的实例。
3、Python中怎么创建闭包
在Python中创建一个闭包可以归结为以下三点:
- 闭包函数必须有内嵌函数
- 内嵌函数需要引用该嵌套函数上一级namespace中的变量
- 闭包函数必须返回内嵌函数
九、单例模式
class Test():def __new__(cls, *args, **kwargs):if not hasattr(cls,'canshu'):cls.canshu=object.__new__(cls)return cls.canshudef __init__(self):pass
这篇关于【011】Python全栈日记-脱发知识点合集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!