herencia – Llamar a métodos de la clase maestra desde otra clase instanciada dentro de esta en PHP

Tengo una clase maestra (que llamo core), que tiene instanciadas dentro otras 30 clases, por ejemplo para gestión de usuarios o para la base de datos, simplificando mucho, las clases se inician parecido a esto:

class core
{
    private function initClasses(array $listado_clases) {
        foreach ($listado_clases as $clase) {
            include "class_".${$clase}.".php";
            ${$clase} = new ${$clase}
        }
    }
}

También tengo un método __call que permite llamar directamente a los métodos de las otras funciones, por ejemplo para la clase usuarios podría llamar un método de estas dos formas:

$core->usuarios->user_info();
$core->user_info();

Todo esto funciona bien, el problema surge cuando necesito llamar desde una de estas clases instanciadas a un método dentro de la clase core o de otra de las clases instanciadas, por ejemplo, si quiero llamar a un método de la clase db desde la clase de usuarios, en la clase core existiría este método puesto que la clase db está instanciada dentro:

$this->db->query();

Pero si trato de llamar a esta clase desde dentro de la clase usuarios, no existe.

He encontrado una solución que funciona, que es pasar toda la clase core a las otras clases instanciadas añadiendo $this como parámetro al iniciarla y creando un wrapper dentro de la otra clase. Esto genera una recursión (de hecho al ver el objeto aparece RECURSION), porque inserto la propia clase dentro de si misma, pero curiosamente no parece producir problemas, es algo similar a esto:

    class core
    {
        private function initClasses(array $listado_clases) {
            foreach ($listado_clases as $clase) {
                include "class_".${$clase}.".php";
                ${$clase} = new ${$clase}($this)
            }
        }
    }

En la clase instanciada, por ejemplo usuarios, está hecho así:

class usuarios
{
    public function __construct($core)
    {
        $this->core = $core;
    }

    public function muestraUsuario($id)
    {
        return $this->core->db->query(SELECT * FROM usuarios WHERE id = $id);
    }
}

De esta forma puedo llamar dentro de esta clase a métodos que están instanciados dentro de core.

¿Existe una forma más correcta de hacer esto?

Tengo mucho código usando esta clase (miles de páginas), así que necesito que se puedan seguir llamando a todos los métodos como está ahora, ya que en este momento todos los métodos se llaman desde la clase core sin importar en cual están realmente, por ejemplo:

$core->db->query();
$core->usuarios->user_info();

Gracias por cualquier ayuda o comentario.

javascript – Por que mi clase en JS me dice undefined

Hola estoy aprendiendo a programar en JS y pues estoy creando una clase pero esta me dice que no esta definida quisiera saber por que pasa esto llevo rato viendo el codigo pero no veo nada mal.

    class celulares {
        constructor(color, peso, resPantalla, resCamara, ram) {
            this.color = color;
            this.peso = peso;
            this.resPantalla = resPantalla;
            this.resCamara = resCamara;
            this.ram = ram;
            this.info = `El celular es de color ${this.color}, pesa ${this.peso} gramos, tiene una resolucion de pantalla de ${this.resPantalla}, la camara tiene una resolucion de ${this.resCamara} mega-pixeles y tiene ${this.ram}gb de memoria Ram`;
    } 

}   const cel1 = new celulares("rojo", 200, 1280, 40, 4);
    document.write(celulares.info); 

Llamando una clase desde otra clase en python no me reconoce un método

Tengo una clase que evalua una mano de poker y devuelve una lista cuyo primer número indica el tipo de jugada que tiene la mano (de este modo puedo hacer self.evaluaMano(mano1) > self.evaluaMano(mano2) para ver qué mano es más alta y por tanto se lleva el bote).

El archivo se llama calculos:

class Calculos():

    def __init__(self):
        print (self.evaluaMano(('Qs','Qc','Qh','5h','6s')))

    def isEscalera(self,nums):
        if set(nums)==set(('A','2','3','4','5')):
            return True,1
        elif set(nums)==set(('2','3','4','5','6')):
            return True,2
        elif set(nums)==set(('3','4','5','6','7')):
            return True,3
        elif set(nums)==set(('4','5','6','7','8')):
            return True,4
        elif set(nums)==set(('5','6','7','8','9')):
            return True,5
        elif set(nums)==set(('6','7','8','9','T')):
            return True,6
        elif set(nums)==set(('7','8','9','T','J')):
            return True,7
        elif set(nums)==set(('8','9','T','J','Q')):
            return True,8
        elif set(nums)==set(('9','T','J','Q','K')):
            return True,9
        elif set(nums)==set(('T','J','Q','K','A')):
            return True,10
        else:
            return False

    def evaluaMano(self,mano):
        totalcards = ('2s','3s','4s','5s','6s','7s','8s','9s','Ts','Js','Qs','Ks','As','2h','3h','4h','5h','6h','7h','8h','9h','Th','Jh','Qh','Kh','Ah','2d','3d','4d','5d','6d','7d','8d','9d','Td','Jd','Qd','Kd','Ad','2c','3c','4c','5c','6c','7c','8c','9c','Tc','Jc','Qc','Kc','Ac')
        fortaleza = ('2','3','4','5','6','7','8','9','T','J','Q','K','A')
        #nada retorna 0
        #pareja retorna 1
        #dobles parejas retorna 2
        #trio retorna 3
        #escalera retorna 4
        #color retorna 5
        #full retorna 6
        #poker retorna 7
        #escalera de color retorna 8
        nums = ()
        colors = ()
        color = False
        for iy in range (len(mano)):
            nums.append(mano(iy)(0))
            colors.append(mano(iy)(1))
        seen = {}
        dupes = ()
        for x in nums:
            if x not in seen:
                seen(x) = 1
            else:
                if seen(x) == 1:
                    dupes.append(x)
                seen(x) += 1
        if len(set(colors))==1:
            color = True
        if color:
            if self.isEscalera(nums):
                index = self.isEscalera(nums)(1)
                return 8,index
            else:
                index = 0
                index1 = fortaleza.index(nums(3))
                index2 = fortaleza.index(nums(4))
                if index1>index2:
                    index = index1
                else:
                    index = index2
                return 5,index,0,0
        if not color and len(set(nums))==5:
            if self.isEscalera(nums):
                index = self.isEscalera(nums)(1)
                return 4,index
            else:
                indexes = ()
                for num in nums:
                    index = fortaleza.index(num)
                    indexes.append(index)
                setindex = sorted(indexes, reverse=False)
                return 0,setindex(4),setindex(3),setindex(2),setindex(1),setindex(0)
        if not color and len(set(nums))==4:
            indexes = ()
            indexpair = 0
            for cartuki in seen:
                if seen(cartuki) == 2:
                    indexpair = fortaleza.index(cartuki)
                else:
                    index = fortaleza.index(cartuki)
                    indexes.append(index)
            kickers = sorted(indexes, reverse=False) #los ordena mal pro alfabético
            return 1,indexpair,kickers(2),kickers(1),kickers(0)
        if not color and len(set(nums))==3:
            trio = False
            cartatrio = ''
            indextrio = 0
            kickerstrio = ()
            kickerdobles = ''
            parejas = ()
            for cartuki in seen:
                if seen(cartuki)==3:
                    trio = True
                    cartatrio = cartuki
                elif seen(cartuki)==2:
                    parejas.append(cartuki)
                elif seen(cartuki)==1:
                    kickerstrio.append(cartuki)
                    kickerdobles = fortaleza.index(cartuki)
            if trio:
                indextrio = fortaleza.index(cartatrio)
                indexkick1 = fortaleza.index(kickerstrio(0))
                indexkick2 = fortaleza.index(kickerstrio(1))
                if indexkick1>indexkick2:
                    return 3,indextrio,indexkick1,indexkick2
                else:
                    return 3,indextrio,indexkick2,indexkick1
            else:
                indexpair1 = fortaleza.index(parejas(0))
                indexpair2 = fortaleza.index(parejas(1))
                i1 = 0
                i2 = 0
                if indexpair1>indexpair2:
                    i1 = indexpair1
                    i2 = indexpair2
                else:
                    i1 = indexpair2
                    i2 = indexpair1
                return 2,i1,i2,kickerdobles

        if not color and len(set(nums))==2:
            poker = False
            triofull = 0
            parejafull = 0
            for cartuki in seen:
                if seen(cartuki)==4:
                    poker = True
                    cartapoker = fortaleza.index(cartuki)
                elif seen(cartuki)==3:
                    triofull = fortaleza.index(cartuki)
                elif seen(cartuki)==2:
                    parejafull = fortaleza.index(cartuki)
            if poker:
                return 7,cartapoker
            else:
                return 6,triofull,parejafull


if __name__=='__main__':
    Calculos()

Esta clase funciona bien. python3 calculos.py devuelve (3, 10, 4, 3) ya que es un trío de reinas.

Sin embargo, tengo una segunda clase que procesa manos de Omaha. En este juego el Omaha se combinan dos cartas de las cuatro que recibes con tres de la mesa. Al llamar a esta clase desde una segunda clase para tratar de calcular las manos de Omaha que tiene un jugador no me procesa bien un método de la primera clase:

from itertools import combinations
from calculos import Calculos

class Flop():

    def __init__(self):
        cardsTable = ('As','Tj','7d')
        cardsPlayer = ('Ad','Th','6d','3s')
        self.calculaFlop(cardsTable,cardsPlayer)

    def calculaFlop(self,cardsTable,cardsPlayer):
        combinacionesPlayer =  list(combinations(cardsPlayer,2))
        for cards in combinacionesPlayer:
            mano = cards + cardsTable
            print (Calculos.evaluaMano(self,mano))

if __name__=='__main__':
    Flop()

python3 flop.py me da el siguiente error:

Traceback (most recent call last):
  File "flop.py", line 18, in <module>
    Flop()
  File "flop.py", line 9, in __init__
    self.calculaFlop(cardsTable,cardsPlayer)
  File "flop.py", line 15, in calculaFlop
    print (Calculos.evaluaMano(self,mano))
  File "/home/manu/Escritorio/OMAHA/calculos.py", line 76, in evaluaMano
     if self.isEscalera(nums):
AttributeError: 'Flop' object has no attribute 'isEscalera'

¿Por qué no me reconoce el método isEscalera cuando llamo la clase desde la segunda clase?

java – Como usar variables de una clase en otra

Digamos tengo una clase principal, en ella uso setters para mandar unas variables int a una clase secundaria, todo va bien hasta aqui porque por medio de getters en la clase principal me imprime todo bien, entonces en una tercera clase quiero hacer operaciones con las variables int, lo intente haciendolo atravez de getters desde la clase secundaria a la tercera pero al momento de hacer operaciones o usar un get me da 0

javascript – Metodo por defecto de una clase al usar await/.then

Puede que me esté dando algunas vueltas a la cabeza, pero para darles contexto, veo que hay funciones que mientras no es llamada como promesa, es un objeto tipico, pero al agregar async/await o ponerle .then/catch la misma se transforma en una promesa… Como ejemplo real, uso knex en node para generar las querys de mysql.

Caso base, tengo esto:

client<User>("mitabla").select("()").where('idUser', 1).first()

Si le hago un console.log, me da la informacion del objeto querybuilder, es decir, la función / código que hace la magia de knex.

Pero cuando hago esto

client<User>("mitabla").select("()").where('idUser', 1).first().then(console.log)

Me intenta realizar una consulta a la base de datos.

Quiero saber como es posible ésto, debido a que no encuentro la informacion indicada, intente leer su codigo en github pero no descifro este proceso. Quiero replicarlo con una clase, pero no se cual seria la funcion-prototipo que es llamada.

En mi codigo, quiero hacer algo como esto:

function builder(name) {
    if (!(this instanceof arguments.callee)) {
        return new arguments.callee(name);
    }
    this.name = name;

    return this
}

builder.toString = () => {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(this.name)
        }, 500)
    });
}

builder("Diego").then(e => console.log(e)) // TypeError: builder(...).then is not a function

python 3.x – ¿Por qué plotly no muestra la gráfica, cuando ejecutos las mismas sentencias dentro de una clase?

Estoy aprendiendo clases. El siguiente script, muestra la gráfica correctamente utilizando plotly express, pero si lo integro como método en una clase, no lo hace.

import pandas as pd
import pandas_datareader as pdr 
import datetime as dt
from datetime import date
from plotly.offline import iplot
import plotly.express as px 

class ImportadorCotizaciones:

    def __init__(self):
        self.cotizaciones = None
        self.start = "2000-1-4"
        self.end = date.today()
        self.cotizaciones = None

    def Importar_cotizaciones(self):

        dicc_tickers = {"IBE.MC":"Iberdrola", "TEF.MC":"Telefonica", "^IBEX":"Ibex35" }
        dfs = ()
        nombres = ()

        for (k,v) in dicc_tickers.items():
            self.cotizaciones_de_ticker = pdr.DataReader(k, 'yahoo', self.start, self.end)
            self.cotizaciones_de_ticker = self.cotizaciones_de_ticker(("Close"))
            self.cotizaciones_de_ticker = self.cotizaciones_de_ticker.rename(columns={"Close": v})

            dfs.append(self.cotizaciones_de_ticker)

        dfs = iter(dfs)
        self.cotizaciones = next(dfs)
        for df_ in dfs:
            self.cotizaciones = self.cotizaciones.merge(df_, on='Date')

class Indicadores:
    def __init__(self, importador):
        self.importador = importador 
    
    def dibujar_grafico(self):
        self.aux_val_ind = importador.cotizaciones(("Iberdrola", "Ibex35")).pct_change().dropna() 
        df = self.aux_val_ind.copy(deep=True)
        df('Media') = df.mean(axis = 1) 
        # Usando plotly.express       
        px.line((df + 1).cumprod() ,y=df.columns ,title=f"nValor de 1€ invertido desde el { importador.start}  hasta el {importador.end} ")

importador = ImportadorCotizaciones()
importador.Importar_cotizaciones()
importador.cotizaciones(:3) 

indicadores = Indicadores(importador)
indicadores.dibujar_grafico()

El script que funciona fuera de la clase es:

# Usando plotly.express
from plotly.offline import iplot
import plotly.express as px

start = "2000-1-4"
end = date.today()
aux_val_ind = importador.cotizaciones(("Iberdrola", "Ibex35")).pct_change().dropna() 
df = aux_val_ind.copy(deep=True)
df('Media') = df.mean(axis = 1) 

px.line((df + 1).cumprod() ,y=df.columns ,title=f"nValor actual de 1€ invertido el {start} ")

introducir la descripción de la imagen aquí
¿Dónde está mi fallo?. Agradeceré ayuda.

Como uno una clase con otra en Python (POO – Herencia Múltiple)

No tengo la mas mínima idea de como hacer para que el calculo de una clase que hice llamada Sueldo (De un archivo llamado Salario), la clase Employee (De un archivo llamado Empleado) pueda usarla…

class Sueldo():
    def __init__(self, hTrabajadas):
        self._hTrabajadas = hTrabajadas
    
    #Metodos @property y .setter
        
    def calculoSueldo(self):
        hBase = 40
        sueldoBase = self._hTrabajadas * 300
        hExtra = self._hTrabajadas - hBase
        sueldoExtra = sueldoBase + (hExtra*400)

        if self._hTrabajadas <= 40:
            return f"${sueldoBase}"
        elif self._hTrabajadas > 40:
            return f"${sueldoExtra}"

La cuenta de calculoSueldo() quiero que pueda usarse en esta Clase:

from Persona import Human
from Salario import Sueldo

class Employee(Human, Sueldo):
    def __init__(self, name, surname, age, dni, email, cellphone, hTrabajadas):
        Human.__init__(self, name, surname, age)
        Sueldo.__init__(self, hTrabajadas)
        self._dni = dni
        self._email = email
        self.cellphone = cellphone

    #Metodos @property y .setter

    def showdata(self):
        return f"nNombre: {self._name}nApellido: {self._surname}nEdad: {self._age}nDNI: {self._dni}nEmail: {self._email}nTelefono: {self._cellphone}nSalario: {self._hTrabajadas}"

En showdata(), en la parte de Salario: {self._hTrabajadas} , es donde me trabé y no puedo terminar el código

Código de prueba final:

from Empleado import Employee

name = input("Nombre: ")
surname = input("Apellido: ")
age = int(input("Edad: "))
dni = int(input("DNI (Sin puntos): "))
email = input("Email: ")
tel = int(input("Telefono: "))
hTrabajadas = int(input("Horas trabajadas: "))

emp1 = Employee(name, surname, age, dni, email, tel, hTrabajadas)
print(emp1.showdata())

El problema esta en que puse hTrabajadas y obviamente no me va a devolver la cuenta, pero no se como resolverlo

Quien pueda ayudarme lo agradezco mucho 😀

poo – JAVA | Error | MVC | La clase importada no retorna los métodos

estuve revisando antes de formular la pregunta y no hay nada relacionado a lo siguiente.

En un proyecto JAVA usando MVC se crearon los respectivos paquetes Modelo, Vista y Controlador. En cada paquete se creo una clase Promedio con el respectivo nombre de paquete, el caso es que al desarrollar la clase PromedioModelo.java se crearon atributos y métodos; dichos atributos con su respectivo método get y set, además de un método llamado ‘solución’ que realizaba el calculo del promedio de números entregados. El caso es el siguiente, al momento de desarrollar la clase PromedioControlador.java cuando necesito importar los métodos de PromedioModelo estos no se importan, al tratar de usar la clase PromedioModelo en Apache NetBeans 12.0 directamente me sugiere ‘PromedioModelo.class…’ lo cual es incorrecto para lo que necesito realizar que es, utilizar los metodos de PromedioModelo, ya sea .getNumberX, .setNumberX, .solucion; Debo indicar que es el único error aparente, ya que NetBeans no menciona ningún error aparente.

Clase PromedioModelo.java

    package modelo;

    public class PromedioModelo {

        float numeroUno;
        float numeroDos;
        float numeroTres;
        float resultado;      

        public float getNumeroUno() {
            return numeroUno;
        }

        public void setNumeroUno(float numeroUno) {
            this.numeroUno = numeroUno;
        }

        public float getNumeroDos() {
            return numeroDos;
        }

        public void setNumeroDos(float numeroDos) {
            this.numeroDos = numeroDos;
        }

        public float getNumeroTres() {
            return numeroTres;
        }

        public void setNumeroTres(float numeroTres) {
            this.numeroTres = numeroTres;
        }

        public float getResultado() {
            return resultado;
        }

        public void setResultado(float resultado) {
            this.resultado = resultado;
        }
    
        public float solucion(){
        
            this.setResultado((this.getNumeroUno()+this.getNumeroDos()+this.getNumeroTres())/3);
            return this.getResultado();
        }
    
    }

Clase PromedioControlador.java


    package controlador;

    import modelo.PromedioModelo;
    import vista.Promedio;

    public class PromedioControlador {
        public static Promedio pro = new Promedio();
        public static void mostrar(){pro.setVisible(true);}
        public static void ocultar(){pro.setVisible(false);}
    
    
        public static void botonPromedio(){
    
            ocultar();
        
            PromedioControlador.mostrar();
        }
    
        public static void botonPrincipal() {

            ocultar();

            VistaControlador.mostrar();
        }

        public static void botonRegistro() {

            ocultar();

            RegistroControlador.mostrar();
        }
    
        public static void btnCalcular() {
    
            //Aquí debería poder utilizar el llamado al método de la clase PromedioModelo
            //Lo cual debería ser similar a esto: PromedioModelo.solucion();

        }
    }

flutter – ¿Cómo pasar una propiedad de un widget a un método de una clase normal?

Necesito pasar este TextEditingController como parametro en esta función de otra clase, ¿cómo podría hacerlo?

class _LoginFormState extends State<LoginForm> {
  @override
  build(BuildContext context) {
    final CmbResponsive responsive = CmbResponsive(context);
    final _emailController = TextEditingController();
    final _passwordController = TextEditingController();

    return Container(
      width: responsive.widthConfig(275.91),
      child: Column(
        children: <Widget>(
          TextField(
            controller: _emailController,
            decoration: InputDecoration(
                labelText: widget.loginModel.emailTextfield,
                border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(CmbSpacing.SpaceMD))),
          ),

Debo pasarlo a esta función login con el getter _emailController.text para poder hacer el login mediante mi TextField

class LoginPresenter {
  LoginPresenter(
    this._loginInterface,
    this._loginRepo,
    this._model,
  );

  final LoginInterface _loginInterface;
  final LoginModel _model;
  final LoginRepo _loginRepo;

  void login() async {
    _loginInterface.showLoading('Iniciando Sesión...');
    final Either<Login, String> resp = await _loginRepo.login();
    _loginInterface.hideLoading();
    resp.fold((login) {
      _loginInterface.navigateToHome();
    }, (err) {
      _loginInterface.showError();
    });
  }
}

Sería genial que me pudiese ayudar, muchas gracias de antemano.

java – Crear una clase que cumpla con lo siguiente

1.- Diseñar una clase llamada Persona que siga las siguientes condiciones:
Sus atributos son:
• nombre,
• edad,
• DNI,
• sexo (H hombre, M mujer),
• peso,
• altura.
No queremos que se accedan directamente a ellos. Piensa que modificador de acceso es el más adecuado, también su tipo. Si quiere añadir algún atributo puedes hacerlo.
Siempre el Nombre deberá estar ingresado al objeto en MAYUSCULA, no importa si cuando se teclea la información esté con mayúsculas y minúsculas. Diseñe un método que al ingresar el valor lo pase al objeto en mayúscula.
Se implantarán varios constructores:
• Un constructor con el nombre, edad y sexo
• Un constructor con todos los atributos como parámetro.
Los métodos que deberá implementaran son:
• calcularIMC(): calculara si la persona está en su peso ideal IMC = Peso (kg) / altura (m)2, devuelve un -1 si está por debajo de su peso ideal, un 0 si está en su peso ideal y un 1 si tiene sobrepeso .
Ejemplo: Altura: 165 cm (1,65 m), Peso: 68 kg
Cálculo: 68 ÷ 1,652 (2,7225) = 24,98
Para determinar si esta bien con su peso debe tener en cuenta:
Si IMC es menor de 18.4  Bajo Peso
Si IMC entre 18.5 a 24.9  Peso ideal
Si IMC de 25 o más  Sobrepeso
• esMayorDeEdad(): indica si es mayor de edad, devuelve un booleano.
• toString(): devuelve toda la información del objeto. Es decir, la información completa de la persona cargada.
• Métodos set de cada parámetro, excepto de DNI.
Se debe crear un programa que solicite el ingreso por teclado el nombre, la edad, sexo, peso y altura.
• Para cada objeto, deberá comprobar si está en su peso ideal, tiene sobrepeso o por debajo de su peso ideal con un mensaje.
• Indicar para cada objeto si es mayor de edad.
• Por último, mostrar la información de cada objeto.