Python, 标题可以取长一点

cc 发布于2019年10月26日 ∣ python ∣ 约971字 · 需2分钟 阅读()

人生苦短我用python

python使用技巧

基本语法之后再掌握下面几个重点就可以起飞了

闭包

迭代器,实现了__iter__,__next__就是迭代器,可以用for/next来一个一个取里面的元素

生成器,包含了yield关键字的函数,会自动创建__iter__,__next__,所以一样可以迭代。这样生成器一定是迭代器,但是迭代器可能只是个列表/字典啥的不是生成器。生成器的一个重要特征是数据是每次用的时候生成,而不是一次性全部加载到内存,这样可以避免使用大量内存造成性能问题。除了使用yield定义,还可以用推导式直接创建生成器

装饰器,其实只是个特殊语法即所谓的语法糖(写起来好看方便),

 1def foo(func):
 2	print('foo')
 3
 4#定义bar并使用foo对bar进行处理后再赋值给bar
 5def bar():
 6	print('bar')
 7bar = foo(bar)  # 这个语句会在模块加载时执行
 8#上面三行代码可以使用@语法来简写代码
 9@foo
10def bar():
11	print('bar')
12bar() # 这里是不能调用的,因为foo返回的是None
13# 这段代码只是说明@语法的含义
14# 装饰函数也可以是对象,只要对象实现了`__call__`方法,其实方法是个特殊的对象,而对象一般没有`__call__`方法,我们用对象名调用时是调用了对象的`__init__`初始化函数

注意这里@foo调用时没有括号,如果用这个装饰函数装饰不同的函数产生不同的效果时

描述符,实现了__set__、__get__、__delete__其中一个以上的对象,给类绑定类成员,与构造函数中绑定实例成员不同。直接定义类成员的时候,我们在实例中可以任意修改设置,需要手动去添加限制,如果在运行过程有多次修改势必要写很多重复的验证代码。这里就可以用描述符来定义成员,通过定义__set__、__get__来验证数据,以及取数据时做相应的处理。直观案例就是django中model定义数据字段的各种Field

1class Person(object):
2  name = ''
3  age = 0
4
5p1 = Person()
6p2 = Person()

实例在调用类成员时,如果实例未修改过类成员值,则直接取类成员值,如果实例修改了自己的类成员,这时实例存储了更改后的值覆盖了类成员

元编程,主要用于修改类的一些行为或属性。django中通过对元类的成员设置来对数据库设置表名或添加索引,这里一个明显特征是统一对model类添加额外的处理。如果是单个类,直接在类定义中处理就好了。

django model中的Meta

怎么理解yield

几个要明确的地方