002 私有化
1、私有化
A、给一个类设置私有属性或方法,前面必须至少两个下划线,但一般很少有人写三个下划线
B、如果一个类的方法名前后各有两个下划线,说明是魔法方法
C、在一个py文件或者说模块里,一个变量或方法前面至少有一个下划线开头,说明这个变量或方法是模块内部的私有变量或方法。
在其他文件中导入该模块时要格外小心,如果你是通过 from thatModule import * 的方式想将那个模块的所有的变量或方法导入本文件中是做不到的,因为一个模块内的私有变量或方法是不支持 from thatModule import * 的方式。
但你可以直接导入那个模块,通过模块本身去获取它的私有变量或属性。
第一种导入方式
第二种导入方式
2、为什么一个类的属性变成私有属性后,就访问不到呢?
打印对象 t 的所有属性和方法,发现列表当中并没有一个叫 __num 的,却发现了一个很像的 _Test__num。
你之所以访问不到类的私有属性或方法,是因为python对它们进行了名字重整,重整后的名字变成 【_类名+私有属性或方法名】
知道私有属性或方法真正的名字后就能使用了,但不推荐这样做
3、property的使用
A、私有属性添加 getter 方法和 setter 方法
A的特点是,无论获取还是设置私有属性都要调用一个方法,我嫌这种方式太笨重
B、使用 property 升级 getter 和 setter 方法
someproperty = property(getter, setter)
之前获取和设置私有属性都要调方法,显得很笨重
使用property我们可以将对私有属性的获取和设置转换成对某个属性的取值和赋值操作
底层还是调用相应的getter和setter方法,但体力活交给python解释器了
t.num --> python 解释器知道调用 t.getNum
t.num = 200 ---> python 解释器知道调用 t.setNum
C、使用property取代getter和setter方法
4、可迭代对象、判断是否可迭代
可迭代对象:for循环可以作用在它身上的对象都是可迭代对象
如:list、tuple、dict、set、str
如:生成器、带 yield 的 generator function
导入 Iterable 类,利用 isinstance 函数判断是否是可迭代对象
5、迭代器
迭代器:可以用 next 方式取值的就是迭代器
6、可迭代对象可以转换为迭代器,通过 Iter 函数
7、闭包是什么
8、闭包的实际例子
9、什么是生成器
列表生成式
10、创建生成器
方法1:
方法2:
函数内加上 yield 关键字
但奇怪的是,函数被调用,无论如何都会打印 start,但实际却不符合预期
原因:只要函数内部加上 yield ,这个函数就变成了生成器,不能再把它当作一个普通的函数了。
普通函数被调用的时候会直接执行,函数式生成器被调用的时候会返回一个生成器对象。
现在开始执行了
yield b 怎样影响函数的执行?
1、函数执行到 yield 语句时,会暂停
2、并把 yield 后面的值返回出去
当生成器没有能力继续生成的时候就会抛出异常
生成器也是可迭代对象,可以用for去循环
11、gen.__next__()
除了用 next 取生成器的下一个对象,还可以用
12、send
生成器不是通过next函数或者 __next__ 方法可以每次取一个值吗
但是你在每取一个值的时候还可以彻底一个参数
这时候需要借助 send 方法
temp = yield i;
不是把 i 的值赋值给 temp,而是把 yield i 的返回值赋值给 temp
yield i 的返回值就是你所传递的参数
send 方法比 __next__ 方法多了一个可以传递参数的功能
t.__next__ = t.send(None)
13、使用send方法需要注意的是
下面这种情况:
解决办法:
1、先调用一次 __next__ 方法,让生成器先运行起来,再使用 send 方法
2、
多任务:
1、协程
2、线程
3、进程
14、生成器的应用