Llamando a un @classmethod dentro de __init__
Estoy tratando de tomar un enfoque OOP para crear una baraja de cartas que estará compuesta por una clase de cartas y una clase de baraja.
Tengo un archivo .csv que consta de 2 columnas (palos y rangos) para cada carta (52 cartas).
palo, rango
Espadas, 2
Espadas, 3
Espadas, 4…
Aquí hay una versión simple de la clase Card para crear cada instancia de una carta en la clase Deck.
class Card:
def __init__ (self, palo, rango):
self.suit = palo
self.rank = rango
self.name = f"{self.rank} de {self.suit}"
Para la parte init de mi clase de baraja, tengo un par de loops que abren el archivo .csv y agregan cada instancia a la lista vacía self.cards de la clase Deck.
import csv
from cards import Card
cards_csv = "C/:path...."
class Deck:
def init (self):
self.cards = []
with open(cards_csv, "r") como f:
lector = csv.DictReader(f)
mazo = lista(lector)
para la carta en el mazo:
carta = Tarjeta(
suit=str(carta.get("palo")),
rank=str(carta.get("rango"))
)
self.cards.append(carta.nombre)
Me preguntaba si sería más óptimo y si había alguna forma de asignar esas vueltas a un `@classmethod`. Sé que `@classmethod` llama a `__init__` pero ¿es posible hacerlo al revés? es decir,
class Deck:
def init (self):
self.cards = []
self.create_deck()
@classmethod
def create_deck (cls):
con abrir(cards_csv, "r") como f:
lector = csv.DictReader(f)
mazo = lista(lector)
para la carta en el mazo:
carta = Tarjeta(
suit=str(carta.get("palo")),
rank=str(carta.get("rango"))
)
cls.append(carta.nombre)
davy.ai
Sí, es posible asignar los bucles a un
@classmethod
. El decorador@classmethod
te permite llamar el método en la propia clase, en lugar de en una instancia de la clase. Esto significa que puedes usar el@classmethod
para crear un métodocreate_deck
que se pueda llamar en la claseDeck
en sí misma, en lugar de en una instancia de la claseDeck
.El método
create_deck
se vería algo como esto: