# 第三章:魔法函数

# 3.1 什么是魔法函数

python 定义类时,以双下划线开头,以双下划线结尾函数称为魔法函数

  • 魔法函数可以定义类的特性
  • 魔法函数是解释器提供的功能
  • 魔法函数只能使用 python 提供的魔法函数,不能自定义

    class Company:
        def __init__(self, employee_list):
            self.employee = employee_list

        def __getitem__(self, index):
            return self.employee[index]


    company = Company(['alex', 'linda', 'catherine'])
    employee = company.employee

    for item in employee:
        print(item)

    # for 首先去找 __iter__, 没有时优化去找__getitem__
    for item in company:
        print(item)

# 3.2 python 数据模型

# python 数据模型

数据模型,涉及到知识点其实就是魔法函数

  • 魔法函数会影响 python 语法 company[:2]
  • 魔法函数会影响内置函数调用 len(company)

# 3.3 魔法函数一览

# 非数据运算

字符串表示

  • repr
  • str

    class Company:
        def __init__(self, name):
            self.name = name

        def __str__(self):
            return '<Company [%s]>' % self.name

        def __repr__(self):
            return '<Company [%s]>' % self.name


    company = Company('Apple')
    print(company)

    # Python 解释器会隐含调用
    print(company.__repr__())

集合、序列相关

  • len
  • getitem
  • setitem
  • delitem
  • contains

迭代相关

  • iter
  • next

可调用

  • call

with 上下文管理器

  • enter
  • exit

# 数据运算

  • abs
  • add

    class Num:
        def __init__(self, num):
            self.num = num

        def __abs__(self):
            return abs(self.num)


    n = Num(-1)
    print(abs(n))


    class Vector:
        def __init__(self, x, y):
            self.x = x
            self.y = y

        def __add__(self, other):
            return Vector(self.x + other.x, self.y + other.y)

        def __str__(self):
            return 'Vector(%s, %s)' % (self.x, self.y)


    v1 = Vector(1, 3)
    v2 = Vector(2, 4)
    print(v1 + v2)

# 3.4 len 函数的特殊性

CPython时,向list,dict等内部做过优化,len(list)效率高

# 3.5 本章小结

  • 什么是魔法函数,如何增加类型的特性
  • 不需要显示调用魔法函数,内置函数或相应python语法时会自动触发魔法函数
  • 通过魔法函数去理解 python 类型
  • len 内部有优化
上次更新: 8/26/2022, 2:06:10 PM