__new__方法和其他一些知识点

 

__new__方法先于__init__方法。著名的self对象就是通过__new__创建的。

 

 

对象A和B在遇到==时,会调用__eq__方法。

 

扑克牌:

from collections import namedtuple
from random import choice
from random import shuffle
import json


Card = namedtuple('Card', ['rank', 'suit'])


class FranchDeck:
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suits = ['黑桃', '红心', '梅花', '方块']

    def __init__(self):
        self._cards = [
            Card(rank, suit)
            for rank in FranchDeck.ranks
            for suit in FranchDeck.suits
        ]

    # 计算一副牌有多少张
    def __len__(self):
        return len(self._cards)

    def __getitem__(self, item):
        return self._cards[item]

    def __setitem__(self, key, value):
        self._cards[key] = value

    def __str__(self):
        return json.dumps(self._cards, ensure_ascii=False)


# 先拿一副牌
deck = FranchDeck()
# 抽第一张牌
print(deck[0])

# 洗牌
shuffle(deck)
# 再抽第一张牌
print(deck[0])
# 随机抽一张
print(choice(deck))
# 打印整副牌
print(deck)

上面的shuffle依赖__setitem__方法,如果没有,就会报错。

此处使用了命名元祖namedtuple、列表生成式、重写__len__方法、重写__getitem__方法、重写__setitem__方法、重写__str__方法

posted @ 2019-11-06 11:48  道霖  阅读(200)  评论(0)    收藏  举报