子类继承总是使用'super()\uuuu init\uuuu()'更好吗。它有什么优势?

2024-05-15 14:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我所知道的所有python都是完全自学的,但我的目标当然是尝试学习什么是最佳实践/通用约定,并尝试理解为什么

我最近才深入研究OOP,所以为了练习OOP,我写了一个21点游戏,因为我听说这是一个学习很多OOP概念的相当快的项目

完整的程序可以在这里找到(GitHub):my blackjack game如果上下文需要(而不是只在这里发布整个程序)

但是我正在努力理解super()__init()到底做了什么,以及与我如何使用子类相比,它是否更可取:为了简单起见,只考虑以下两个:DeckMultiDeck,这是Deck
的子类 以下是游戏中的狙击手:

import collections
import random
import time 

Card = collections.namedtuple('Card', ['value', 'suit'])


class Deck:

    values = [str(v) for v in range(2, 11)] + list('JQKA')
    suits = "Spades Diamonds Hearts Clubs".split()
    suit_symbols = ['♠','♦','♥','♣']

    def __init__(self):
        self.cards = [Card(value, suit) for suit in self.suits for value in self.values]

    def __repr__(self):
        deck_cards = "Deck()\n"
        for card in self.cards:
            deck_cards += f"({card.value}-{card.suit})"
        return deck_cards

    def __len__(self):
        return len(self.cards)

    def __getitem__(self, position):
        return self.cards[position]

    def shuffle(self):
        random.shuffle(self.cards)

    def draw_card(self):
        return self.cards.pop()

    def reset(self):
        self.cards = [Card(value, suit) for suit in self.suits for value in self.values]

class MultiDeck(Deck):

    def __init__(self, num_decks):
        Deck.__init__(self)
        self.values = Deck.values * num_decks

    # reshuffle when deck is < 50% length
    def is_shuffle_time(self, num_decks):
        return  len(self) < (len(MultiDeck(num_decks))/2)

    def shuffle_time(self):
        print("Reshuffling the Deck...\n")
        time.sleep(1)
        print("Reshuffling the Deck...\n")
        time.sleep(1)
        print("Reshuffling the Deck...\n")
        time.sleep(1)
        self.reset()
        self.shuffle()

与下面的相反:哪种方法更好:首先,super()应该在超类Deck中声明还是不声明?我偶然发现了许多看似不同的答案(但与旧版本相比,这可能是python 3的结果)
是否更好地定义MultiDeck如下:

class MultiDeck(Deck):

    def __init__(self, num_decks):
        super().__init__()
        self.values = super().values * num_decks   

在最后一行,在初始化self.values时,最好使用Deck.valuessuper().values

如果使用super()实际上是更好的实践,那么super().__init()提供了什么优势或额外的好处呢。写这篇文章是不是更不受欢迎(如果是,为什么?
我希望我甚至正确地使用了它,例如,从我所读到的内容来看,这似乎是使用super()的方法,但如果没有,请纠正我。
感谢您提前提供的任何信息


Tags: inselffortimeinitvaluedefnum