# item系列实现后,可以用 [] 去操作对象
class Item():
# pass
def __getitem__(self, item):
print('hello')
# return 'test'
return self.__dict__[item]
def __setitem__(self, key, value):
self.__dict__[key] = value
print(key, value) # a b
def __delitem__(self, key):
self.__dict__.pop(key)
item = Item()
# print(item['a']) # 对象名[] 会自动执行 __getitem__ 方法,但因为实例化后对象为空,没有'a',会抛异常,return 'test'时无异常
print(item.__dict__) #{} 初始化的对象为空
item['a'] = 'b' # 当赋值时会自动调用 __setitem__ 方法进行传值
print(item.__dict__) # {'a': 'b'} __setitem__方法执行后对象不再为空
print(item['a']) # hello b 再次执行 对象名[] 会自动调用__getitem__内置方法,当注释掉 __getitem__ 方法时抛异常
del item['a'] # 执行 del 对象名[] 删除对象元素
print(item.__dict__) # {} 删除后为空
#示例
from collections import namedtuple # 具名元组
from random import choice # 随机读取元素
from random import shuffle # 打乱元素顺序
Card = namedtuple('Card', ['rank', 'suit'])
class Poker():
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
sutis = ['Spade', 'Heart', 'Diamond', 'Club']
def __init__(self):
self._cards = []
for rank in Poker.ranks:
for suit in Poker.sutis:
self._cards.append(Card(rank, suit))
def __len__(self):
return len(self._cards)
def __getitem__(self, item):
return self._cards[item]
def __setitem__(self, item, value):
self._cards[item] = value
poker = Poker()
print(poker[0])
print(choice(poker)) # choice随机读取,并且依赖__len__ 和 __getitem__ 方法
shuffle(poker) # shuffle 依赖 __len__、__getitem__、__setitem__ 三个方法
print(poker[0]) # 打乱后第一个元素改变