Uno de los conceptos centrales en programación orientada a objetos (OOP) los idiomas son herencia. Es un mecanismo que le permite crear una jerarquía de clases que comparten un conjunto de propiedades y métodos derivando una clase de otra clase. La herencia es la capacidad de una clase de derivar o heredar las propiedades de otra clase.
Los beneficios de la herencia son:
La herencia le permite heredar las propiedades de una clase, es decir, la clase base, a otra, es decir, la clase derivada. Los beneficios de la herencia en Python son los siguientes:
- 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 funciones 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ían automáticamente de la clase A.
- La herencia ofrece una estructura de modelo simple y comprensible.
- Menos gastos de desarrollo y mantenimiento resultan de una herencia.
Sintaxis de herencia de Python
La sintaxis de herencia simple en Python es la siguiente:
Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body}> Crear una clase principal
Una clase padre es una clase cuyas propiedades son heredadas por la clase hija. Creemos una clase principal llamada Persona que tiene un Mostrar método para mostrar la información de la persona.
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
Una clase secundaria es una clase que controla las propiedades de su clase principal. Aquí Empezar es otra clase que va a heredar las propiedades del Persona clase (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
Veamos un ejemplo de herencia simple de Python en el que una clase secundaria hereda las propiedades de su clase principal. En este ejemplo, 'Persona' es la clase principal y 'Empleado' es su clase secundaria.
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 una clase de objeto en Python?
Como el Clase de objeto Java , en Python (desde la versión 3. x), el objeto es la raíz de todas las clases.
- En Python 3.x, la clase Prueba (objeto) y la clase Prueba son iguales.
- En Python 2. x, la clase Prueba(objeto) crea una clase con el objeto como padre (llamada clase de nuevo estilo), y la clase Prueba crea una clase de estilo antiguo (sin un padre objetante).
Subclases (llamando al constructor 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.
Ejemplo: clase nombre_subclase (nombre_superclase)
En este ejemplo, 'a' es la instancia creada para la clase Persona. Invoca el __init__() de la clase referida. Puedes 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 de instancia u objetos. Por tanto, 'nombre' y 'número de identificación' son los objetos de la clase Persona. De manera similar, 'salario' y 'puesto' son 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.
Python3
lista de matrices java ordenar
# 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>
Programa Python para demostrar 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 el mismo motivo.
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'>
La función super()
El función super() es una función incorporada que devuelve los objetos que representan la clase principal. Permite acceder a los métodos y atributos de la clase principal en la clase secundaria.
Ejemplo: Función super() con herencia simple de Python
En este ejemplo, creamos el objeto 'obj' de la clase secundaria. Cuando llamamos al constructor de la clase secundaria 'Estudiante', inicializó los miembros de datos con los valores pasados durante la creación del objeto. Luego, usando la función super(), invocamos el constructor de la clase padre.
Python3
# parent class> class> Person():> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >def> display(>self>):> >print>(>self>.name,>self>.age)> # child class> class> Student(Person):> >def> __init__(>self>, name, age):> >self>.sName>=> name> >self>.sAge>=> age> ># inheriting the properties of parent class> >super>().__init__(>'Rahul'>, age)> >def> displayInfo(>self>):> >print>(>self>.sName,>self>.sAge)> obj>=> Student(>'Mayank'>,>23>)> obj.display()> obj.displayInfo()> |
>
>
Producción:
Rahul 23 Mayank 23>
Agregar propiedades
Una de las características que proporciona la herencia es heredar las propiedades de la clase principal, así como agregar nuevas propiedades propias a la clase secundaria. Veamos esto con un ejemplo:
Python3
# parent class> class> Person():> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >def> display(>self>):> >print>(>self>.name,>self>.age)> # child class> class> Student(Person):> >def> __init__(>self>, name, age, dob):> >self>.sName>=> name> >self>.sAge>=> age> >self>.dob>=> dob> ># inheriting the properties of parent class> >super>().__init__(>'Rahul'>, age)> >def> displayInfo(>self>):> >print>(>self>.sName,>self>.sAge,>self>.dob)> obj>=> Student(>'Mayank'>,>23>,>'16-03-2000'>)> obj.display()> obj.displayInfo()> |
>
>
Producción:
Aquí podemos ver que agregamos una nueva propiedad a la clase secundaria, es decir, fecha de nacimiento (fecha de nacimiento).
Rahul 23 Mayank 23 16-03-2000>
Diferentes tipos de herencia de Python
Hay 5 tipos diferentes de herencia en Python. Son los siguientes:
- Herencia única: cuando una clase secundaria hereda de una sola 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 de hijo y nieto. Esto significa que una clase hija heredará de su clase padre, que a su vez hereda de su clase padre.
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 Se puede crear más de una clase derivada a partir de una única base. Herencia híbrida: esta forma combina más de una forma de herencia. Básicamente, es una combinación 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 principal.
No siempre queremos que las variables de instancia de la clase principal sean heredadas por la clase secundaria, es decir, podemos hacer que algunas de las variables de instancia de la clase principal sean privadas, lo que no estará disponible para la clase secundaria.
En la herencia de Python, 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.c)> print>(object1.__d)> |
>
>
Producción :
Aquí podemos ver que cuando intentamos imprimir la variable 'c', su valor 21 se imprime en la consola. Mientras que cuando intentamos imprimir 'd', generó el error. Esto se debe a que la variable 'd' se hace privada mediante el uso de guiones bajos. No está disponible para la clase secundaria 'D' y de ahí el error.
21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'>