python特殊方法

from math import hypot

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

    def __repr__(self): # 交互式控制台和调试程序,表示字符串,__str__被str()调用
        return 'Vector(%r, %r)' % (self.x, self.y)

    def __abs__(self):
        return hypot(self.x , self.y)

    def __bool__(self): # 如果不存在__bool__,那么bool(x)会调用x.__len__(),如果0,返回False,否则True
        return bool(abs(self))

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

    def __mul__(self, scalar):
        return Vector(self.x * scalar)

其他Python魔术方法指南

列表

board = [['_'] * 3 for i in range(3)]
board = [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

# 一个谜题
t = (1, 2, [30, 40])
t[2] += [50, 60]
# 会发生什么呢?
t = (1, 2, [30, 40, 50, 60]) # 同时报元组不可修改的错

sorted(list, key=str.lower, reverse=True)

import bisect #二分的方法查找插入
bisect.bisect()
bisect.insort()

# 当列表不是首选时,其他的数据结构array, set, deque
from array import array #数组
from random import random
floats = array('d', (random() for i in range(10*7))) #类型码d是双精度浮点数组
floats.tofile()
floats.fromfile()

# 内存视图,在数据结构之间共享内存
numbers = array.array('h', [-2, -1, 0])
memv = memoryview(numbers)
len(memv) -> 5

from collections import deque
dq = deque(range(10), maxlen=10)
dq.rotate(3) # 队列旋转
dp.appendleft(-1)
dp.extend([11, 22])
dp.extendleft([8, 9])

# 其他queue queue, multiprocessing, asyncio, heapq