Digamos que queremos proporcionar una abstracción de una "cuenta" en un banco. Aquí hay un enfoque, usando un function
objeto en Python:
def account():
"""Return a dispatch dictionary representing a bank account.
>>> a = account()
>>> a['deposit'](100)
100
>>> a['withdraw'](90)
10
>>> a['withdraw'](90)
'Insufficient funds'
>>> a['balance']
10
"""
def withdraw(amount):
if amount > dispatch['balance']:
return 'Insufficient funds'
dispatch['balance'] -= amount
return dispatch['balance']
def deposit(amount):
dispatch['balance'] += amount
return dispatch['balance']
dispatch = {'balance': 0,
'withdraw': withdraw,
'deposit': deposit}
return dispatch
Aquí hay otro enfoque que usa abstracción de tipo (es decir, class
palabra clave en Python):
class Account(object):
"""A bank account has a balance and an account holder.
>>> a = Account('John')
>>> a.deposit(100)
100
>>> a.withdraw(90)
10
>>> a.withdraw(90)
'Insufficient funds'
>>> a.balance
10
"""
def __init__(self, account_holder):
self.balance = 0
self.holder = account_holder
def deposit(self, amount):
"""Add amount to balance."""
self.balance = self.balance + amount
return self.balance
def withdraw(self, amount):
"""Subtract amount from balance if funds are available."""
if amount > self.balance:
return 'Insufficient funds'
self.balance = self.balance - amount
return self.balance
Mi maestro comenzó el tema "Programación orientada a objetos" introduciendo la class
palabra clave y mostrándonos estos puntos:
Programación orientada a objetos
Un método para organizar programas modulares:
- Barreras de abstracción
- Paso de mensajes
- Agrupando información y comportamiento relacionado
¿Crees que el primer enfoque sería suficiente para satisfacer la definición anterior? En caso afirmativo, ¿por qué necesitamos la class
palabra clave para hacer programación orientada a objetos?
design
object-oriented
python
object-oriented-design
object
cambio excesivo
fuente
fuente
class
hace una optimización similar).foo.bar()
generalmente es idéntico yfoo['bar']()
, en raras ocasiones, la última sintaxis es realmente útil.object['method'](args)
, los objetos de Python realmente hacen el equivalente deobject['method'](object, args)
. Esto se vuelve relevante cuando una clase base llama a métodos en una clase secundaria, por ejemplo, en el Patrón de estrategia.Respuestas:
¡Felicidades! Redescubrió el hecho bien conocido de que la orientación de los objetos se puede hacer sin un soporte de lenguaje de programación específico. Básicamente es la misma forma en que los objetos se introducen en Scheme en este libro de texto clásico . Tenga en cuenta que Scheme no tiene una
class
palabra clave o algún tipo de equivalente, y los objetos se pueden crear sin tener incluso clases.Sin embargo, el paradigma orientado a objetos fue tan exitoso que muchos lenguajes, y Python no es una excepción, le brindan soporte integrado. Esto es simplemente para facilitar a los desarrolladores el uso del paradigma y proporcionar una forma estándar de orientación a objetos para ese lenguaje. Es esencialmente la misma razón por la que muchos idiomas proporcionan un
for
bucle, aunque podría emularse usando unwhile
bucle con solo una o dos líneas de código adicionales, simplemente facilidad de uso .fuente
Estoy de acuerdo en que la primera definición satisface los tres puntos que su maestro hizo. No creo que necesitemos la palabra clave de clase para nada. Debajo de las cubiertas, ¿qué más es un objeto sino una estructura de datos con diferentes tipos de datos y funciones para trabajar con los datos? Por supuesto, las funciones también son datos.
Iría aún más lejos y diría que hacer programación orientada a objetos no depende tanto de las palabras clave que proporciona su lenguaje, ¡puede hacer programación orientada a objetos en C si así lo desea! De hecho, el kernel de Linux emplea tales técnicas.
Lo que puede inferir de la palabra clave de clase aquí es que el lenguaje proporciona soporte para este tipo de construcción de forma inmediata, y no necesita pasar por todos los aros para volver a implementar la funcionalidad usted mismo (lo cual es una tarea bastante divertida en ¡sí mismo!). Sin mencionar todo el azúcar sintáctico que podrías obtener también.
fuente
¡Por supuesto que puede!
El lenguaje de programación automática es un lenguaje dinámico orientado a objetos basado en prototipos en el que todo es un objeto y no tiene sentido de clases ni de ningún tipo. Se centra en la idea de objetos prototípicos y la idea de clonarlos en lugar de tener clases como plantillas de cómo crear objetos.
Debe consultar http://www.selflanguage.org/ para obtener más información. Creo que es muy interesante y si te gusta OOP es una buena idea verificar algo que no es tan común.
fuente
No siempre: depende del idioma. Ha demostrado la capacidad de hacer esto en Python pero (si su pregunta pretende ser independiente del idioma a pesar de la etiqueta de Python) no todos los idiomas pueden hacer esto. Java, por ejemplo, en su mayoría no puede. Ignorando la clase que contiene main, no hay forma de definir métodos / campos arbitrarios en un objeto definido dentro de main sin la palabra clave class. Aunque existen clases anónimas, requieren una interfaz y no pueden tener ningún miembro público, excepto los definidos en la interfaz. Si bien es posible definir interfaces personalizadas y luego crear clases anónimas para ellos, esto es efectivamente lo mismo (pero menos conveniente) que simplemente usar una clase.
Doc Brown tiene una gran respuesta, pero lo que estoy tratando de decir es que estoy seguro de que hay al menos un idioma que no permitirá su solución en absoluto.
fuente
class
palabra clave, por lo que no es una gran sorpresa. Pero absolutamente podría implementar su propio sistema de objetos sobre el sistema de objetos de Java, aunque no sé por qué quiere hacer tal cosa.class
palabra clave solo porque el lenguaje requiere que ponga sus funciones en clases. Por supuesto, esto es extremadamente teórico, ¡pero incluso en Java puedes hacer Orientación de Objetos sin las clases integradas!La definición de tu profesor pierde por completo el punto más importante de la programación orientada a objetos, lo único que lo hace útil y único. "Transmitir mensajes" es un montón de tonterías soñadas por la gente de Smalltalk, y ha sido un fracaso en todas partes donde se ha intentado. El verdadero poder de OOP es algo conocido como sustitución de Liskov , y si bien el concepto es bastante simple de describir y comprender, la implementación subyacente es lo suficientemente compleja como para que sea esencialmente imposible hacer lo correcto sin el soporte de nivel de lenguaje.
La idea de la sustitución de Liskov es que en cualquier lugar donde su código esté esperando una variable de cierto tipo, debería ser capaz de aceptar cualquier tipo derivado de ese tipo y seguir funcionando correctamente sin tener que tener conocimiento de los detalles del tipo derivado.
Por ejemplo, los marcos de GUI utilizan la sustitución de Liskov en todo el lugar. Tienden a tener una
Control
clase base que puede representar "cualquier control", que define una interfaz que conoce acciones básicas como dibujar, redimensionar y responder a las entradas del usuario. Si hace clic en un control, el marco de la IU llamará a unClick
método en el control sin tener que preocuparse de qué tipo de control es, y luego dejará que el control maneje el clic de la manera apropiada para su propia clase. UnButton
control debe hacer algo completamente diferente al hacer clic en élTextBox
, para dar solo un ejemplo.Entonces, sí, puede crear algo similar a los objetos utilizando el truco de funciones anidadas descrito anteriormente, pero como no puede obtener la herencia y la sustitución de Liskov de esa manera, es un sustituto extremadamente limitado para la verdadera POO.
fuente
child*
a una función que toma unparent*
como argumento, al menos no sin una conversión tipográfica). Y lo que es peor, las estructuras C no pueden tener métodos vinculados a ellas, y no hay soporte para métodos virtuales , que son lo que hace que la magia de la sustitución de Liskov funcione, por lo que debe construir VMT a mano, que es un proceso complicado que es fácil de arruinar.Respuesta corta rápida
Sí, los programadores pueden aplicar la programación orientada a objetos sin "clases".
Respuesta descriptiva extensa y aburrida
Hay varias variaciones de "Orientación a objetos", aunque el primer concepto que les viene a la mente a muchos programadores es "Clases".
Sí, los programadores pueden aplicar la programación orientada a objetos sin "clases", pero se limita a las características y limitaciones de cada lenguaje de programación.
Su publicación está etiquetada como Python , por lo tanto, el título de su pregunta puede ser más como "Cómo implementar la programación orientada a objetos sin clases en Python".
Actualmente utilizo la frase "Programación orientada a objetos y clases", para identificar otras variaciones como "Prototipos" de Javascript, o "Basados" en Visual Basic, o emulación en "Pure C" usando "functores".
fuente