Herencia en Python – Part 1

La herencia es la capacidad de una clase para derivar o heredar las propiedades de otra clase. 

Los beneficios de la herencia son: 

  • Representa bien las relaciones del mundo real.
  • Proporciona la reutilización de un código. No tenemos que escribir el mismo código una y otra vez. Además, nos permite agregar más características a una clase sin modificarla.
  • Es de naturaleza transitiva, lo que significa que si la clase B hereda de otra clase A, entonces todas las subclases de B heredarán automáticamente de la clase A.

Sintaxis de herencia de Python

Class BaseClass:
    {Body}
Class DerivedClass(BaseClass):
    {Body}

Creación de una clase principal

Creación de una clase de persona con métodos de visualización .

Python3

# A Python program to demonstrate inheritance
 
class Person(object):
   
  # Constructor
  def __init__(self, name, id):
    self.name = name
    self.id = id
 
  # To check if this person is an employee
  def Display(self):
    print(self.name, self.id)
 
 
# Driver code
emp = Person("Satyam", 102) # An Object of Person
emp.Display()

Producción:

Satyam 102

Crear una clase secundaria

Aquí Emp es otra clase que va a heredar las propiedades de la clase Person (clase base).

Python3

class Emp(Person):
   
  def Print(self):
    print("Emp class called")
     
Emp_details = Emp("Mayank", 103)
 
# calling parent class function
Emp_details.Display()
 
# Calling child class function
Emp_details.Print()

Producción:

Mayank 103
Emp class called

Ejemplo de herencia en Python 

Python3

# A Python program to demonstrate inheritance
 
# Base or Super class. Note object in bracket.
# (Generally, object is made ancestor of all classes)
# In Python 3.x "class Person" is
# equivalent to "class Person(object)"
 
 
class Person(object):
 
    # Constructor
    def __init__(self, name):
        self.name = name
 
    # To get name
    def getName(self):
        return self.name
 
    # To check if this person is an employee
    def isEmployee(self):
        return False
 
 
# Inherited or Subclass (Note Person in bracket)
class Employee(Person):
 
    # Here we return true
    def isEmployee(self):
        return True
 
 
# Driver code
emp = Person("Geek1")  # An Object of Person
print(emp.getName(), emp.isEmployee())
 
emp = Employee("Geek2")  # An Object of Employee
print(emp.getName(), emp.isEmployee())

Producción: 

Geek1 False
Geek2 True

¿Qué es la clase de objeto?

Al igual que la clase Java Object , en Python (desde la versión 3.x), el objeto es la raíz de todas las clases. 

  • En Python 3.x, «prueba de clase (objeto)» y «prueba de clase» son iguales. 
  • En Python 2.x, «class Test(object)» crea una clase con el objeto como padre (llamada clase de nuevo estilo), y «class Test» crea una clase de estilo antiguo (sin padre que se oponga). 

Subclases (constructor de llamadas de la clase principal)

Una clase secundaria necesita identificar qué clase es su clase principal. Esto se puede hacer mencionando el nombre de la clase principal en la definición de la clase secundaria. 

Por ejemplo: class subclass_name (superclass_name)

Python3

# Python code to demonstrate how parent constructors
# are called.
 
# parent class
class Person(object):
 
    # __init__ is known as the constructor
    def __init__(self, name, idnumber):
        self.name = name
        self.idnumber = idnumber
 
    def display(self):
        print(self.name)
        print(self.idnumber)
 
# child class
 
 
class Employee(Person):
    def __init__(self, name, idnumber, salary, post):
        self.salary = salary
        self.post = post
 
        # invoking the __init__ of the parent class
        Person.__init__(self, name, idnumber)
 
 
# creation of an object variable or an instance
a = Employee('Rahul', 886012, 200000, "Intern")
 
# calling a function of the class Person using its instance
a.display()

Producción: 

Rahul
886012

‘a’ es la instancia creada para la clase Persona. Invoca el __init__() de la clase referida. Puede ver ‘objeto’ escrito en la declaración de la clase Persona. En Python, cada clase hereda de una clase básica integrada llamada ‘objeto’. El constructor, es decir, la función ‘__init__’ de una clase, se invoca cuando creamos una variable de objeto o una instancia de la clase.
Las variables definidas dentro de __init__() se denominan variables u objetos de instancia. Por lo tanto, ‘nombre’ y ‘número de identificación’ son los objetos de la clase Persona. De manera similar, ‘salario’ y ‘puesto’ son los objetos de la clase Empleado. Dado que la clase Empleado hereda de la clase Persona, ‘nombre’ y ‘número de identificación’ también son objetos de la clase Empleado.

Programa de Python para demostrar el error si olvidamos invocar __init__() del padre

Si olvida invocar el __init__() de la clase principal, sus variables de instancia no estarán disponibles para la clase secundaria. 

El siguiente código produce un error por la misma razón. 

Python3

class A:
    def __init__(self, n='Rahul'):
        self.name = n
 
 
class B(A):
    def __init__(self, roll):
        self.roll = roll
 
 
object = B(23)
print(object.name)

Producción : 

Traceback (most recent call last):
  File "/home/de4570cca20263ac2c4149f435dba22c.py", line 12, in 
    print (object.name)
AttributeError: 'B' object has no attribute 'name'

Diferentes tipos de Herencia:

  • Herencia única : cuando una clase secundaria hereda solo de una clase principal, se denomina herencia única. Vimos un ejemplo arriba.
  • Herencias múltiples : cuando una clase secundaria hereda de varias clases principales, se denomina herencia múltiple. 

A diferencia de Java, Python muestra múltiples herencias.

Python3

# Python example to show the working of multiple
# inheritance
 
 
class Base1(object):
    def __init__(self):
        self.str1 = "Geek1"
        print("Base1")
 
 
class Base2(object):
    def __init__(self):
        self.str2 = "Geek2"
        print("Base2")
 
 
class Derived(Base1, Base2):
    def __init__(self):
 
        # Calling constructors of Base1
        # and Base2 classes
        Base1.__init__(self)
        Base2.__init__(self)
        print("Derived")
 
    def printStrs(self):
        print(self.str1, self.str2)
 
 
ob = Derived()
ob.printStrs()

Producción: 

Base1
Base2
Derived
Geek1 Geek2
  • Herencia multinivel : Cuando tenemos una relación hijo y nieto. 

Python3

# A Python program to demonstrate inheritance
 
# Base or Super class. Note object in bracket.
# (Generally, object is made ancestor of all classes)
# In Python 3.x "class Person" is
# equivalent to "class Person(object)"
 
 
class Base(object):
 
    # Constructor
    def __init__(self, name):
        self.name = name
 
    # To get name
    def getName(self):
        return self.name
 
 
# Inherited or Sub class (Note Person in bracket)
class Child(Base):
 
    # Constructor
    def __init__(self, name, age):
        Base.__init__(self, name)
        self.age = age
 
    # To get name
    def getAge(self):
        return self.age
 
# Inherited or Sub class (Note Person in bracket)
 
 
class GrandChild(Child):
 
    # Constructor
    def __init__(self, name, age, address):
        Child.__init__(self, name, age)
        self.address = address
 
    # To get address
    def getAddress(self):
        return self.address
 
 
# Driver code
g = GrandChild("Geek1", 23, "Noida")
print(g.getName(), g.getAge(), g.getAddress())

Producción: 

Geek1 23 Noida
  • Herencia jerárquica Más de una clase derivada se crea a partir de una única base.
  • Herencia híbrida : esta forma combina más de una forma de herencia. Básicamente, es una mezcla de más de un tipo de herencia.

Para obtener más detalles, lea este artículo: Tipos de herencia en Python

Miembros privados de la clase padre 

No siempre queremos que las variables de instancia de la clase principal sean heredadas por la clase secundaria, es decir, podemos hacer privadas algunas de las variables de instancia de la clase principal, que no estarán disponibles para la clase secundaria. 
Podemos hacer que una variable de instancia sea privada agregando guiones bajos dobles antes de su nombre. Por ejemplo,

Python3

# Python program to demonstrate private members
# of the parent class
 
 
class C(object):
    def __init__(self):
        self.c = 21
 
        # d is private instance variable
        self.__d = 42
 
 
class D(C):
    def __init__(self):
        self.e = 84
        C.__init__(self)
 
 
object1 = D()
 
# produces an error as d is private instance variable
print(object1.d)

Producción : 

  File "/home/993bb61c3e76cda5bb67bd9ea05956a1.py", line 16, in 
    print (object1.d)                     
AttributeError: type object 'D' has no attribute 'd'

Dado que ‘d’ se hace privado por esos guiones bajos, no está disponible para la clase secundaria ‘D’ y, por lo tanto, el error.

Publicación traducida automáticamente

Artículo escrito por ShivangiSrivastava1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *