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