所以我試圖采用 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.cards中Deck。
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)
uj5u.com熱心網友回復:
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(),或者使用Deck.create_deck().
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362175.html
下一篇:派生類的物件是如何用C 構造的
