Hemos discutido los siguientes temas sobre Programación Orientada a Objetos en Python
- Programación Orientada a Objetos en Python | serie 1
- Programación Orientada a Objetos en Python | Conjunto 2 (Ocultación de datos e impresión de objetos)
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())
('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))
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()
Base1 Base2 Derived ('Geek1', 'Geek2')
¿Cómo acceder a los miembros principales en una subclase?
- 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
=
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)
- 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)
-
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
-
# 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')
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
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