python基础第9章 魔法方法、属性和迭代器(一)
__getitem__和__setitem__:
这个方法返回与指定键想关联的值。对序列来说,键应该是0~n-1的整数,其中n为序列的长度。对映射来说,键可以是任何类型。
class A :
__getitem__:
print(x)
实例化 a = A(),则a[y]就会调用这个方法
def checkIndex(key):
"""
所给的键是能接受索引吗?
为了能被接受,键应该是一个非负的整数。如果她不是一个整数,会引发TypeError;
如果他是负数,则会引发IndexError(因为序列是无限长的)
"""
if not isinstance(key, (str,int)):raise TypeError
if key < 0:raise IndexError
class ArithmeticSequence:
def __init__(self, start=0, step=1):
"""
初始化算术序列
起始值-序列中的第一个值
步长-两个相邻之间的差别
改变-用户修改值的字典
"""
self.start = start #保存开始值
self.step =step #保存步长值
self.changed = {} #没有项被修改
def __getitem__(self,key):
"""
Get an item from the arithmetic sequence,
这个方法在使用是x[key]模式时会被触发,
"""
checkIndex(key)
try:
return self.changed[key] #修改了吗
except KeyError: #否则
return self.start + key*self.step #...计算值
def __setitem__(self, key, value):
"""
修改算术序列中的一个项
这个方法在x[key]=时候被触发
"""
checkIndex(key)
self.changed[key] = value # 保存修改后的值
'''
总结:
1、魔法方法python内嵌实现特定功能的
2、魔法方法的触发不是常规触发,而是特殊的动作,如__init__是类初始化时触发,而上述是在直接[key]引用或者赋值时是触发
'''

浙公网安备 33010602011771号