魔法相关的内容
知识点
切片
1 | list_name = [1, 2, 3, 4, 5, 6] |
私有属性
获取实例对象中的所有实例属性:实例对象名.__dict__
获取类对象中所有的类属性:类名.__dict__
私有属性在对象中的存储方式
对一个对象设置私有属性,则对象会将其名称修改为【_类名__属性名】来存储
魔法属性
1 | # __doc__: 返回类的描述,也就是类的注释 |
with和上下文管理器
背景
任何实现了__enter__()和__exit__()方法的类对象都可以称之为文件管理器。当然也可以通过修饰符@contextmanager和yield实现
实现方式
利用__enter__()和__exit__()实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20class ContextTest(object):
def __init__(self, name, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
print("start")
self.f = open(self.filename, self.mode)
return self.f
def __exit__(self):
print("close")
self.f.close()
# with调用时会检测后面的对象(ContextTest),如果发现是上下文管理器,则直接调用该对象内部的__enter__方法
# __enter__方法一般会返回一个操作对象(不是ContextTest创建的),将这个对象赋值给f
# 运行过程中,如果发生异常或是运行结束,则直接调用__exit__方法
with ContextTest('out.txt', 'w') as f:
f.write('success')利用@contextmanager修饰符实现
1
2
3
4
5
6
7
8
9
10
11from contextlib import contextmanager
def File(filename, mode):
f = open(filename, mode)
yield f
f.close()
# 执行时会自动调用
with File('out.txt', 'w') as f:
f.read()
作业
- 现有列表list_name, 现将该列表的前三个元素替换为[1,2,3,4,5]
- 现有实例对象personal,请将该对象所有的实例属性全部打印出来
- 现有类对象Personal,现将该对象所有的类属性全部打印出来
- 假如现有实例对象,其中含有私有属性__name,请问如何在外部访问该私有属性
- 现有实例对象personal,请打印出创建该对象的类的描述信息
- 现有实例对象personal,请打印出创建该对象的类信息
- 现有实例对象personal,请打印出该对象的类所存放的模块名称
- (问答)创建类时常用的方法__init__的作用是什么
- (问答)创建类时常用的方法__del__的作用是什么
- (问答)创建类时常用的方法__call__的作用是什么,如何调用该方法
- 现有实例对象personal,请打印出该对象的描述信息
- (问答)什么是上下文管理器
- (问答)请简述with和上下文管理器使用时,调用方法的过程
- 利用__enter__()和__exit__()实现文件读写的上下文管理器
- 利用contextmanager修饰符实现上下文管理器