es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)


Tags:  , , , ,

Answer

  1. Avatar for 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étodo create_deck que se pueda llamar en la clase Deck en sí misma, en lugar de en una instancia de la clase Deck.

    El método create_deck se vería algo como esto:

    @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.cards.append(card.name)
    

    El método create_deck se puede llamar en la clase Deck en sí misma, en lugar de en una instancia de la clase Deck. Esto te permite crear una instancia de Deck sin tener que crear manualmente cada instancia de tarjeta.

Comments are closed.