Si tengo dos clases, y una de ellas tiene una función que quiero usar en mi otra clase, ¿qué uso debo utilizar para no tener que volver a escribir mi función?Python usando métodos de otras clases
20
A
Respuesta
25
Hay dos opciones:
- instanciar un objeto de su clase, a continuación, llamar al método deseado en él
- uso @classmethod para activar una función en un método de la clase
Ejemplo:
class A(object):
def a1(self):
""" This is an instance method. """
print "Hello from an instance of A"
@classmethod
def a2(cls):
""" This a classmethod. """
print "Hello from class A"
class B(object):
def b1(self):
print A().a1() # => prints 'Hello from an instance of A'
print A.a2() # => 'Hello from class A'
O utilizar la herencia, en su caso:
class A(object):
def a1(self):
print "Hello from Superclass"
class B(A):
pass
B().a1() # => prints 'Hello from Superclass'
6
crea una clase de la cual ambas clases heredan.
Hay herencia múltiple, por lo que si ya tienen un padre no es un problema.
class master():
def stuff (self):
pass
class first (master):
pass
class second (master):
pass
ichi=first()
ni=second()
ichi.stuff()
ni.stuff()
21
Existen varios enfoques:
- herencia
- Delegación
- Super-astuto delegación
Los siguientes ejemplos utilizan cada para compartir una función que imprime un miembro.
Herencia
class Common(object):
def __init__(self,x):
self.x = x
def sharedMethod(self):
print self.x
class Alpha(Common):
def __init__(self):
Common.__init__(self,"Alpha")
class Bravo(Common):
def __init__(self):
Common.__init__(self,"Bravo")
Delegación
class Common(object):
def __init__(self,x):
self.x = x
def sharedMethod(self):
print self.x
class Alpha(object):
def __init__(self):
self.common = Common("Alpha")
def sharedMethod(self):
self.common.sharedMethod()
class Bravo(object):
def __init__(self):
self.common = Common("Bravo")
def sharedMethod(self):
self.common.sharedMethod()
Super-astuto Delegación
Esta solución está basada en el hecho de que no hay nada especial sobre el miembro de Python funciones; puede usar cualquier función u objeto invocable siempre que el primer parámetro se interprete como la instancia de la clase.
def commonPrint(self):
print self.x
class Alpha(object):
def __init__(self):
self.x = "Alpha"
sharedMethod = commonPrint
class Bravo(object):
def __init__(self):
self.x = "Bravo"
sharedMethod = commonPrint
O, una forma disimulada de manera similar de lograr una delegación es el uso de un objeto invocable:
class Printable(object):
def __init__(self,x):
self.x = x
def __call__(self):
print self.x
class Alpha(object):
def __init__(self):
self.sharedMethod = Printable("Alpha")
class Bravo(object):
def __init__(self):
self.sharedMethod = Printable("Bravo")
Cuestiones relacionadas
- 1. Usando cadenas de otras clases C#
- 2. ¿Cómo extender apropiadamente otras clases en Python? (python v3.3)
- 3. ¿Pueden dos clases verse unas a otras usando C++?
- 4. clases de decisiones públicas a otras clases en C++
- 5. JMock Permitir otras llamadas a métodos
- 6. Métodos estáticos falsos de múltiples clases usando PowerMock
- 7. Usar correctamente las clases en otras clases en php?
- 8. informe de clases y métodos
- 9. Método de acceso de otras clases Objetivo-C
- 10. clases Anónimo interior dentro Métodos
- 11. Métodos estáticos en clases genéricas?
- 12. Métodos de productor vs clases con nombre
- 13. métodos virtuales y clases de plantilla
- 14. métodos públicos en clases privadas de paquete
- 15. C# Métodos de llamada en clases genéricas
- 16. Python ... clases de prueba?
- 17. Usando otras fuentes de datos para cubism.js
- 18. Intellij generate javadoc para métodos y clases
- 19. Ruby Class Métodos vs. Métodos en clases propias
- 20. ¿Manera fácil de anular los métodos predeterminados en clases personalizadas de Python?
- 21. Clases y métodos abstractos en Java, Herencia
- 22. Mejor enfoque con clases dinámicas usando Python globals()
- 23. organizando clases y módulos en python
- 24. Rhino: clases de imitación y métodos virtuales no predeterminados
- 25. Ventajas de las clases con solo métodos estáticos en C++
- 26. Llamando métodos idénticos en las clases base
- 27. XML Comentando sobre clases/métodos parciales
- 28. marcador @see, enlazar otros métodos clases
- 29. Mockito - clases burlones con métodos nativos
- 30. Cuándo usar clases y métodos estáticos?
horrible y leer en mi humilde opinión. –
No hay herencia múltiple aquí. Esta es una herencia única, aunque es posible que esté pensando en la herencia jerárquica. – Nikwin
@Nikwin, +1 como iba a decir eso. –