1、包装是在之前原有的方法的基础上,在做一点改动,这叫包装,就像包装那个append方法

现在我们来做一个open方法

 

python 抖音 用户授权 python软件授权_python 抖音 用户授权

2、啥都没做,那我们来改动一下

现在就创建了一个a.txt

 

python 抖音 用户授权 python软件授权_python 抖音 用户授权_02

3、再改善一下

 

python 抖音 用户授权 python软件授权_父类_03

4、我们看下我们自己的这个read跟系统的open方法的read是不是一个东西

 

python 抖音 用户授权 python软件授权_python 抖音 用户授权_04

5、现在f.write也能调用了。read你会调用了write也是一样的呀,实例里面没有,类里面也没有,最终触发了getattr,getattr里面是调用的系统的open方法里面的write。所以肯定是可以的

 

python 抖音 用户授权 python软件授权_父类_05

6、我们执行一下write操作看看能不能写入到文件里面

结果是a.txt里面成功写入了,现在就牛逼了。我们发现我们的实例f1是通过FileHandle这个方法进行write的,并不是系统的open的方法里面的write属性,是经过了getattr中转了一下。

 

python 抖音 用户授权 python软件授权_python 抖音 用户授权_06

7、我们seek一下,再读一下,到这一步,我们发现,相当于open的所有的方法都传递过来了,都可以正常使用了,上一个是学的包装,继承和派生完成的包装,继承是父类由什么我就继承过来,现在到这里就相当于把open里面的方法继承过来了

 

python 抖音 用户授权 python软件授权_python 抖音 用户授权_07

8、上面完成了读操作了,还没有完成写操作呢

实例再调用wirte的方法的时候,先在实例的属性字典里面找,然后去类的属性字典里面找,找不到的话才会触发getattr,所以我们想完成写操作,就在类里面定义一个write的方法就行了,当实例调用的时候会先从类里面找到write就直接执行了

 

python 抖音 用户授权 python软件授权_python 抖音 用户授权_08

现在这个write就是调用的自己在类里面定义的那个write方法了,并没有真实的写入到文件中去,而且单纯的打印了一下东西

9、如何实现文件的真正的写操作呢

 

python 抖音 用户授权 python软件授权_python 抖音 用户授权_09

10、给文件内容的前面每行都加上时间

 

python 抖音 用户授权 python软件授权_python 抖音 用户授权_10

这种就是组合的方式,给self.file赋予了一个文件描述符,然后利用__getattr__来return所有正常的open里面的所有的属性,如果我们不自己定制write的方法的话,所有的方法就已经是跟系统的方法一样了,但是我们自己定制了write的方法了,给前面加了时间,当然也可以做其他的,比如直接pass,那其他人在调用write的方法的时候就写入不了了