1

estoy siguiendo un tutorial y me salta una duda con este programa:

import datetime

class Cuaderno():
    """ Docstring """
    def __init__(self, memo, tags=""):
        self.memo = memo
        self.tags = tags
        self.creation_date = datetime.date.today()
        self.id = self.ids()

    def ids(self):
        var += 1
        return var

notas = Cuaderno("Hola")

La cuestión es como agregar un id que vaya aumentando de uno en uno, cuando creo un nuevo objeto de la clase Cuaderno. Lo que tengo no funciona, porque tendría que instanciar la variable primero y claro, en ese caso, se resetearía el valor. Mi duda es... ¿Es mejor usar una variable global y luego usar global para hacer referencia a esa variable? O veis alguna otra forma de hacerlo?

Gracias.

Man
  • 137
  • 6
  • Un [atributo de clase](https://www.python-course.eu/python3_class_and_instance_attributes.php), `Cuaderno.id` – abulafia Jul 17 '19 at 22:19
  • es como lo dices tu si queres tener un id/contador de cuantos objetos se crean, la variable y función no debe pertenecer a la clase. Lo mejor es definir la función fuera de la clase para que no se cree ese evento por cada objeto. –  Jul 17 '19 at 22:32

2 Answers2

3

En vez de usar una variable global usa un atributo de clase que es compartido por todas las instancias de la misma. Puede ser un simple contador (int) y cada vez que instancias tu clase aumentas el valor del mismo y asocias dicho valor (id) a un atributo de instancia (self.id) que será exclusivo de dicha instancia:

import datetime

class Cuaderno:
    """ Docstring """

    _id = 0

    def __init__(self, memo, tags=""):
        self.memo = memo
        self.tags = tags
        self.creation_date = datetime.date.today()
        self.id = self._ids()

    @classmethod
    def _ids(cls):
        cls._id += 1
        return cls._id
>>> notas1 = Cuaderno("Hola")
>>> notas1.id
1
>>> notas2 = Cuaderno("Hola")
>>> notas2.id
2
>>> notas3 = Cuaderno("Hola")
>>> notas3.id
3
FJSevilla
  • 55,603
  • 7
  • 35
  • 58
0

Podrias utilizar lo siguiente:

import datetime
import itertools


class Cuaderno():
    """ Docstring """
    id_iter = itertools.count()

    def __init__(self, memo, tags=""):
         self.memo = memo
         self.tags = tags
         self.creation_date = datetime.date.today()
         self.id = next(self.id_iter) +1



notas = Cuaderno("Hola")