0

所以我正在尝试采用 OOP 方法来制作一副由卡片类和卡片组组成的卡片组。

我有一个 .csv 文件,其中包含每张卡片(52 张卡片)的 2 列(套装和等级)。

suit,rank
Spades,2
Spades,3
Spades,4...

这是类的一个简单版本,用于在Card类中创建卡片的每个实例Deck

class Card:

    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
        self.name = f"{self.rank} of {self.suit}"

对于__init__我的甲板类的一部分,我有几个循环打开 .csv 文件并将每个实例附加到类的空列表self.cardsDeck

import csv
from cards import Card

cards_csv = "C/:path...."

class Deck:
    def __init__(self):
        self.cards = []
        with open(cards_csv, "r") as f:
            reader = csv.DictReader(f)
            deck = list(reader)

        for card in deck:
            card = Card(
                suit=str(card.get("suit")),
                rank=str(card.get("rank"))
            )
            self.cards.append(card.name)

我想知道它是否会更优化,以及是否有办法将这些循环分配到@classmethod. 我知道@classmethod电话__init__,但可以反过来做吗?IE

class Deck:
    def __init__(self):
        self.cards = []
        self.create_deck()

    @classmethod
    def create_deck(cls):
        with open(cards_csv, "r") as f:
            reader = csv.DictReader(f)
            deck = list(reader)

        for card in deck:
            card = Card(
                suit=str(card.get("suit")),
                rank=str(card.get("rank"))
            )
            cls.append(card.name)
4

1 回答 1

0

create_deck如果你要从__init__已经存在的实例的方法中调用它,那么作为一个类方法是没有意义的。将它作为一个常规的、未修饰的实例会更有意义,并将self其作为它的参数:

def create_deck(self):
    with open(cards_csv, "r") as f:
        reader = csv.DictReader(f)
        deck = list(reader)

    for card in deck:
        card = Card(
            suit=str(card.get("suit")),
            rank=str(card.get("rank"))
        )
        self.cards.append(card.name)

如果您需要替代构造函数,则类方法很有用。它是你调用的东西而不是类本身,它为你处理创建实例:

class Deck:
    def __init__(self):
        self.cards = []
        # don't call create_deck here, it's now an optional alternative constructor

    @classmethod
    def create_deck(cls):
        with open(cards_csv, "r") as f:
            reader = csv.DictReader(f)
            deck = list(reader)

        inst = cls()                      # create the instance

        for card in deck:
            card = Card(
                suit=str(card.get("suit")),
                rank=str(card.get("rank"))
            )
            inst.cards.append(card.name)  # append to the new instance's cards list

        return inst

现在您可以使用 . 创建一个空牌Deck()组,或者使用从 CSV 文件加载的卡片创建一个Deck.create_deck()

于 2021-11-18T08:30:34.833 回答