__getitem__(self,key): 返回键对应的值。
__setitem__(self,key,value): 设置给定键的值
__delitem__(self,key): 删除给定键对应的元素。
__len__(): 返回元素的数量
【注释】只要实现了 __getitem__ 和 __len__ 方法,就会被认为是序列。
这些魔术方法的原理就是:当我们对类的属性item进行下标的操作时,首先会被 __getitem__()、__setitem__()、__delitem__() 拦截,从而执行我们在方法中设定的操作,如赋值,修改内容,删除内容等等。
这个方法应该以与键相关联的方式存储值,以便之后能够使用 __setitem__ 来获取。当然,这个对象可变时才需要实现这个方法。
举个栗子:
定义一副扑克牌(不包括大小王),对牌进行洗牌,然后发牌。
Output:
【注意】 :我们会发现output中,输出了: slice(1, 3, None) ,下面给出解释。
语法:
参数说明:
slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。
举两个栗子来看看:
Output:
切片原理
output
(程序员必会的 hhhhh.....)
看看slice在python3.7中是怎么描述的:
from tkinter import *
import time
import random
class Ball:
def init (self,canvas,color):
# print("begin create ball:",type(canvas),color)
self.canvas=canvas
self.id=canvas.create_oval(10,10,25,25,fill=color) #,绘制带颜色和上下坐标的椭圆形oval,保存小球ID
self.canvas.move(self.id,250,100) #用x方向和y方向位移,让小球移动到中心位置(500/2200/2)
starts=[-3,-2,-1,1,2,3]
random.shuffle(starts) #重新洗牌,对随机数重新放置
self.x=starts[0]
self.y=-3
self.canvas_height=self.canvas.winfo_height() #获取画布当前高度
self.canvas_width=self.canvas.winfo_width() #获取画布当前宽度
tk = Tk()
tk.title('弹球游戏')
tk['width']=400
tk['height']=300
tk.resizable(False,False) #窗口大小不能调整,也可以用0替代False
tk.wm_attributes("-topmost",1) #此窗口放到其他所有窗口之前
canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0) #后面两个具名函数 bd high...表示画笔之外无边框
canvas.pack() #调整画布大小
tk.update() #动画初始化
ball = Ball(canvas,'red') #把画布保存到对象变量中,准备在它上面画球
while True:
ball.draw()
#重画图像
tk.update_idletasks()
tk.update()
#等待一会
time.sleep(0.01)
tk.mainloop() # stops mainloop
1、__str__,只有打印单个对象有效,比如:print(对象1),
__repr__() ,打印列表中的对象也有效,比如:print([对象1,对象2,对象3])
2、就是一个嵌套的推导式
3、84-90合并一下,更容易理解
就是一个列表的排序