0

hola soy bastante nuevo en esto de programar con letras (solía hacerlo en binario con electrónica discreta) y tengo 1 duda con el siguiente codigo

"""Variables Globales"""
P=0
PG=1

class h:

    def valE(self):
        es=P
        return es

    def esc(self):
        if self.valE():
            print("no hay punta")
        else:
            print("esta escrito")
            global PG
            PG=PG -1

    def desG(self):
        G=PG
        return G

    def pt(self):
        if not self.desG():
            global P
            P = P +1

Mi problema es que cuando yo ejecuto ""esc"" modifico el valor de ""PG"" a 0 como quiero que suceda, pero el valor de "P" no aumenta a 1 si no ejecuto manualmente ""pt"" Mi pregunta es como puedo hacer para que después de que PG llegue a 0 se ejecute ""pt"" automáticamente así cambie el valor de P a 1,

Diego Rueda
  • 519
  • 2
  • 15
  • Lo mejor es poner despues de `PG = PG-1` de tu funcion `esc`, un `if PG == 0:` y mandar a llamar a `pt` – Luis Alejandro May 09 '19 at 20:36
  • disculpa pero como hago para llamar a ""pt"" dentro de""esc"" para que se ejecute?, por que puedo llamar a una función para usar sus valores pero no para ejecutarla – Sarptos May 09 '19 at 20:55
  • con `self.pt()`, ya lo haces en tu función `esc` al llamar a `valE`, pero igual concuerdo con @FJSevilla en su respuesta acerca de las variables locales – Luis Alejandro May 09 '19 at 21:16

1 Answers1

1

Unas cuantas observaciones:

  • Evita usar variables globales a no ser que sean totalmente imprescindibles o esté totalmente justificado su uso. Generalmente deben reducirse solo a constantes.

    Las razones son varias, dificultan la la reutilización del código (que es precisamente una de las ideas principales de la POO y las clase) además propician la aparición de efectos colaterales, inesperados y difíciles de depurar cuando son modificadas y accedidas desde varias partes del código, potenciando también la creación del llamado "código spagueti".

    En su lugar puedes usar atributos de instancia o atributos de clase (si quieres que se compartan entre todas las instancias de la clase).

  • Los métodos valE y desG, tal como están no tienen utilidad alguna, simplemente retornan una referencia al int al que apunta P y PG respectivamente. En Python todo son objetos (incluidas las funciones y clases), las variables son solo identificadores que tiene asignadas referencias a objetos almacenados en memoria. Cuando haces es=P lo único que haces es crear una variable local al método (que se destruye en cuanto el método retorna) y asignarle la referencia al objeto al que apunta P, es decir dos variables que apuntan al mismo objeto, no copias ni creas un objeto nuevo, solo otro nombre para hacer referencia al mismo objeto. Después return es retorna la referencia al objeto al que apunta es. Es decir, es idéntico a hacer return G, solo que por el camino creas una variable que no sirve para nada realmente.

    No se si ambos métodos son una especie de getter, en tal caso en Python no existe ese concepto como tal, en su lugar accede directamente a los atributos.

  • Para llamar al método de instancia pt desde cualquier otro método de instancia solo tienes que hacer self.pt().

Tu clase, usando atributos de instancia podría quedar así:

class H:
    def __init__(self, p, pg):
        self.p = p
        self.pg = pg

    def esc(self):
        if self.p:
            print("No hay punta")
        else:
            print("Está escrito")
            self.pg -= 1

            if self.pg == 0:
                self.pt()

    def pt(self):
        if not self.pg:
            self.p += 1


h = H(p=0, pg=1)
print(h.p, h.pg) # 0 1
h.esc()
print(h.p, h.pg) # 1 0
FJSevilla
  • 55,603
  • 7
  • 35
  • 58
  • esto que me explicas acá es mas o menos lo que quería ver, pero parece que no entendiste bien lo que escribir, mi idea original era hacer un lapiz, que cuando escribiera se le rompiera la punta, por eso es ""valE""(validez escribir), en 0 es igual a punta intacta, y en 1 punta rota, y ""desG""(desgaste grafito) seria cuantas veces puedo escribir con el lápiz (1 vez en este caso) , igual me sirve por que no me quedaba claro bien lo del llamar a otra función, – Sarptos May 12 '19 at 01:11
  • también quería agregar que utilice `valE` y `desG` por que al ser variables globales no podía(o no se)llamarlas, y esa es la única manera de usarlas, si fueran variables locales no las hubiera utilizado, perdón si parezco tonto pero aprendo sobre la marcha casi , viendo tutoriales y escribiendo mucho hasta que salga algo que funcione – Sarptos May 12 '19 at 01:46