item

# 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]) # 打乱后第一个元素改变

 

posted @ 2025-02-07 21:04  尐少  阅读(16)  评论(0)    收藏  举报