1

tengo dos preguntas sobre Python que aunque he buscado por otros foros no me he quedado muy convencido sobre ello.

  1. No entiendo muy bien en Python la importacion de los paquetes, por ejemplo en Java si quiero usar la clase BufferedReader (para lectura de ficheros) importo el paquete junto con la clase: import java.io.BufferedReader o si quiero importar todas las clases de un paquete: import java.io.*.Pero en python hay dos modos de importacion: import paquete.clase o from paquete import x ¿Cuando se usa la primera y cuando la segunda? Ya me ha pasado que en alguna clase si la importo de la primera manera no me detecta los metodos y dice que esa clase no ha sido importada y tengo que hacerlo con el segundo import, como la clase datetime, sin embargo con otras clases no pasa eso.

2)¿Cuál es la diferencia entre crear un atributo de la clase o un atributo de una instancia? Me explico, podemos crear una clase Perro

class Perro():
      patas=4

y a continuacion el constructor

  def __init__(self,nombre,etc):
    self.nombre=nombre

mi pregunta es cual es la diferencia respecto a lo siguiente:

class Perro():

 def __init__(self,nombre,etc):
     patas=4
     self.nombre=nombre

cuando definir el atributo fuera del constructor y cuando fuera y la diferencia.

En Java por ejemplo siempre declaro los atributos fuera del constructor.

public class Perro{
   private final int patas=4
   private String nombre;
   private Int identificador
  
   //constructor
   public void Perro(String nombre,int identificador){
   this.nombre=nombre;
   this.identificador=identificador
}
}
Developer
  • 20
  • 5
JavAnubis
  • 27
  • 2
  • Sobre la forma de importación en el fondo es igual, pero es más conveniente usar `import module`, hay que escribir un poco más, pero es más legible el código. Puedes usar `from module import foo` si vas a usar pocos métodos de ese módulo. Lo que sí es que evita usar `from module import *` [Más info](https://es.stackoverflow.com/a/40482/80870) | Y, ¿Esto responde tu segunda pregunta? https://es.stackoverflow.com/a/132570/80870 – aeportugal Aug 09 '20 at 21:20
  • Muchas gracias por tomarte tu tiempo en responder y por el enlace a otra respuesta muy estructurada. – JavAnubis Aug 10 '20 at 04:45
  • Son dos preguntas en la misma publicación, esto no es válido. Considera formular dos preguntas a parte. –  Oct 09 '20 at 14:26

1 Answers1

0

En cuanto a la diferencia entre crear un atributo de clase o uno de instancia, en la práctica solamente hay diferencia si modificas los atributos de la clase y creas varias instancias de dicha clase.

Por ejemplo:

class Cosa1:
    atributo = 1

class Cosa2:
    def __init__(self):
        self.atributo = 1


cosa11 = Cosa1()
Cosa1.atributo = 2
cosa12 = Cosa1()
print(cosa12.atributo) # 2

cosa21 = Cosa2()
Cosa2.atributo = 2
cosa22 = Cosa2()
print(cosa22.atributo) # 1

La clase Cosa1 tiene un atributo que puede modificarse mediante Cosa1.atributo = 2. Las nuevas instancias de dicha clase se inicializarán con el nuevo valor de Cosa1.atributo.

En el caso de la clase Cosa2, si ejecutas Cosa2.atributo = 2 efectivamente la clase ahora cuenta con un nuevo atributo cuyo valor es 2, pero al crear nuevas instancias de esta clase el atributo de la instancia siempre se sobreescribe en el método __init__ mediante self.atributo = 1.

BetaM
  • 30,571
  • 7
  • 32
  • 50
tecnobillo
  • 751
  • 3
  • 10