d0d836dc25f2e16000312c91c5fe1709
Python, 标题可以取长一点
人生苦短我用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