Programación orientada a objetos en Python | Conjunto 3 (Herencia, ejemplos de objeto, issubclass y super)

Hemos discutido los siguientes temas sobre Programación Orientada a Objetos en Python

En este artículo, se introduce la herencia.

Una de las principales ventajas de la Programación Orientada a Objetos es la reutilización. La herencia es uno de los mecanismos para lograrlo. En la herencia, una clase (generalmente llamada superclase) es heredada por otra clase (generalmente llamada subclase). La subclase agrega algunos atributos a la superclase.

A continuación se muestra un programa Python de muestra para mostrar cómo se implementa la herencia en Python.

   
# 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 employee
    def isEmployee(self):
        return False
  
  
# Inherited or Sub class (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)

¿Cómo verificar si una clase es subclase de otra?
Python proporciona una función issubclass() que nos dice directamente si una clase es una subclase de otra clase.

# Python example to check if a class is
# subclass of another
  
class Base(object):
    pass   # Empty Class
  
class Derived(Base):
    pass   # Empty Class
  
# Driver Code
print(issubclass(Derived, Base))
print(issubclass(Base, Derived))
  
d = Derived()
b = Base()
  
# b is not an instance of Derived
print(isinstance(b, Derived))
  
# But d is an instance of Base
print(isinstance(d, Base))
Producción:

True
False
False
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, «clase de prueba (objeto)» crea una clase con objeto como padre (llamada nueva clase de estilo) y «clase de prueba» crea una clase de estilo antiguo (sin objeto padre). Consulte esto para obtener más detalles.

¿Python admite la herencia múltiple?
A diferencia de Java y como C++, Python admite la herencia múltiple. Especificamos todas las clases principales como una lista separada por comas entre paréntesis.

# Python example to show 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')

¿Cómo acceder a los miembros principales en una subclase?

  1. Usando el nombre de la clase principal

    # Python example to show that base
    # class members can be accessed in
    # derived class using base class name
    class Base(object):
      
        # Constructor
        def __init__(self, x):
            self.x = x    
      
    class Derived(Base):
      
        # Constructor
        def __init__(self, x, y):
            Base.x =
            self.y = y
      
        def printXY(self):
           
           # print(self.x, self.y) will also work
           print(Base.x, self.y)
      
      
    # Driver Code
    d = Derived(10, 20)
    d.printXY()
    Producción:

    (10, 20)
    
  2. Usando super()
    También podemos acceder a los miembros de la clase padre usando super.

    # Python example to show that base
    # class members can be accessed in
    # derived class using super()
    class Base(object):
      
        # Constructor
        def __init__(self, x):
            self.x = x    
      
    class Derived(Base):
      
        # Constructor
        def __init__(self, x, y):
              
            ''' In Python 3.x, "super().__init__(name)"
                also works''' 
            super(Derived, self).__init__(x)
            self.y = y
      
        def printXY(self):
      
           # Note that Base.x won't work here
           # because super() is used in constructor
           print(self.x, self.y)
      
      
    # Driver Code
    d = Derived(10, 20)
    d.printXY()
    Producción:

    (10, 20)
    
  3. Tenga en cuenta que los dos métodos anteriores no son exactamente iguales. En el próximo artículo sobre herencia, cubriremos los siguientes temas.
    1) ¿Cómo funciona súper? ¿En qué se diferencian el acceso a un miembro a través del super y el nombre de la clase principal?
    2) ¿Cómo se maneja el problema de Diamond en Python?

     

    Ejercicio:
    predecir la salida de los siguientes programas de Python

    1.    
      class X(object):
          def __init__(self, a):
              self.num = a
          def doubleup(self):
              self.num *= 2
        
      class Y(X):
          def __init__(self, a):
              X.__init__(self, a)
          def tripleup(self):
              self.num *= 3
        
      obj = Y(4)
      print(obj.num)
        
      obj.doubleup()
      print(obj.num)
        
      obj.tripleup()
      print(obj.num)
      Producción:

      4
      8
      24
      
    2. # Base or Super class
      class Person(object):
          def __init__(self, name):
              self.name = name
                
          def getName(self):
              return self.name
            
          def isEmployee(self):
              return False
        
      # Inherited or Subclass (Note Person in bracket)
      class Employee(Person):
          def __init__(self, name, eid):
        
              ''' In Python 3.0+, "super().__init__(name)"
                  also works''' 
              super(Employee, self).__init__(name)
              self.empID = eid
                
          def isEmployee(self):
              return True
                
          def getID(self):
              return self.empID
        
      # Driver code
      emp = Employee("Geek1", "E101"
      print(emp.getName(), emp.isEmployee(), emp.getID())
      Producción:

      ('Geek1', True, 'E101')
      

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *