魔法相关的内容

知识点

切片

1
2
3
4
list_name = [1, 2, 3, 4, 5, 6]

list_name[:3] = [11] # 会用新列表的信息替换掉原列表的前三个元素值,按照个数一一对应,少则其它位置不变
list_name[:3] = [11, 22, 33, 44, 55, 55] # 多的话,原列表除切片位置意外的保持不变,然后切片位置全部用新列表覆盖

私有属性

  1. 获取实例对象中的所有实例属性:实例对象名.__dict__

    获取类对象中所有的类属性:类名.__dict__

  2. 私有属性在对象中的存储方式

    对一个对象设置私有属性,则对象会将其名称修改为【_类名__属性名】来存储

魔法属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# __doc__: 返回类的描述,也就是类的注释
对象名.__doc__

# __class__:获取生成当前实例对象的类名
对象名.__class__

# __module__:获取对象所处的模块(文件名)
对象名.__module__

# __init__:用于实例对象的初始化的方法
def __init__(self, name):
self.name = name

# __del__:内存中删除对象时执行的方法
def __del__(self):
del self.name

# __call__:直接使用【实例对象名()】时触发的方法
def __call__(self):
print(self.name)
实例对象名()

# __dict__:获取类和实例对象中所有的属性信息
对象名.__dict__

# __str__:返回当前对象的描述信息,必须返回文本信息
def __str__(self):
return self.name
print(实例对象名)

# __getitem__、__setitem__、__delitem__:设置将对象当作字典来对待的方法
# __getitem__:获取字典信息,直接使用【变量名 = 对象名[key信息]】时触发
# __setitem__:设置字典信息,使用【对象名[key信息] = 值】时触发
# __delitem__:删除字典信息,使用【del 对象名[key信息]】时触发

# __getslice__、__setslice__、__delslice__:设置将对象当作列表来对待的方法
# __getslice__:获取列表信息,直接使用【变量名 = 对象名[索引]】时触发
# __setslice__:设置列表信息,直接使用【对象名[索引] = 值】时触发
# __delslice__:删除列表信息,直接使用【del 对象名[索引]】时触发

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
      20
      class 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
      11
      from contextlib import contextmanager

      @contextmanager
      def File(filename, mode):
      f = open(filename, mode)
      yield f
      f.close()

      # 执行时会自动调用
      with File('out.txt', 'w') as f:
      f.read()

作业

  1. 现有列表list_name, 现将该列表的前三个元素替换为[1,2,3,4,5]
  2. 现有实例对象personal,请将该对象所有的实例属性全部打印出来
  3. 现有类对象Personal,现将该对象所有的类属性全部打印出来
  4. 假如现有实例对象,其中含有私有属性__name,请问如何在外部访问该私有属性
  5. 现有实例对象personal,请打印出创建该对象的类的描述信息
  6. 现有实例对象personal,请打印出创建该对象的类信息
  7. 现有实例对象personal,请打印出该对象的类所存放的模块名称
  8. (问答)创建类时常用的方法__init__的作用是什么
  9. (问答)创建类时常用的方法__del__的作用是什么
  10. (问答)创建类时常用的方法__call__的作用是什么,如何调用该方法
  11. 现有实例对象personal,请打印出该对象的描述信息
  12. (问答)什么是上下文管理器
  13. (问答)请简述with和上下文管理器使用时,调用方法的过程
  14. 利用__enter__()和__exit__()实现文件读写的上下文管理器
  15. 利用contextmanager修饰符实现上下文管理器