Angenommen, wir möchten eine Abstraktion eines "Kontos" in einer Bank bereitstellen. Hier ist ein Ansatz, bei dem ein function
Objekt in Python verwendet wird:
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
Hier ist ein anderer Ansatz, der die Typabstraktion verwendet (z. B. class
Schlüsselwort in 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
Mein Lehrer begann das Thema "Objektorientierte Programmierung", indem er das class
Schlüsselwort einführte und uns die folgenden Stichpunkte zeigte:
Objekt orientierte Programmierung
Eine Methode zur Organisation modularer Programme:
- Abstraktionsbarrieren
- Nachrichtenübergabe
- Informationen und zugehöriges Verhalten bündeln
Glauben Sie, dass der erste Ansatz ausreichen würde, um die obige Definition zu erfüllen? Wenn ja, warum benötigen wir das class
Schlüsselwort, um objektorientiert zu programmieren?
design
object-oriented
python
object-oriented-design
object
überaustausch
quelle
quelle
class
eine ähnliche Optimierung durchführt).foo.bar()
ist normalerweise identisch mitfoo['bar']()
und in seltenen Fällen ist die letztere Syntax tatsächlich nützlich.object['method'](args)
, tun Python-Objekte tatsächlich das Äquivalent vonobject['method'](object, args)
. Dies wird relevant, wenn eine Basisklasse Methoden in einer untergeordneten Klasse aufruft, z. B. im Strategy Pattern.Antworten:
Herzliche Glückwünsche! Sie haben die bekannte Tatsache wiederentdeckt, dass die Objektorientierung ohne spezielle Programmiersprachenunterstützung durchgeführt werden kann. Es ist im Grunde die gleiche Art und Weise, wie Objekte in diesem klassischen Lehrbuch in Schema eingeführt werden . Beachten Sie, dass für das Schema kein
class
Schlüsselwort oder eine Art Äquivalent vorhanden ist und dass Objekte ohne gleichmäßige Klassen erstellt werden können.Das objektorientierte Paradigma war jedoch so erfolgreich, dass viele Sprachen - und Python ist keine Ausnahme - integrierte Unterstützung dafür bieten. Dies dient lediglich dazu, Entwicklern die Verwendung des Paradigmas zu erleichtern und eine Standardform der Objektorientierung für diese Sprache bereitzustellen. Es ist im Wesentlichen derselbe Grund, warum viele Sprachen eine
for
Schleife bereitstellen , obwohl sie mit einerwhile
Schleife mit nur ein oder zwei zusätzlichen Codezeilen emuliert werden kann - einfach benutzerfreundlich .quelle
Ich würde zustimmen, dass die erste Definition die drei Punkte erfüllt, die Ihr Lehrer gemacht hat. Ich glaube nicht, dass wir das Schlüsselwort class für irgendetwas brauchen . Was ist ein anderes Objekt als eine Datenstruktur mit unterschiedlichen Datentypen und Funktionen, um mit den Daten zu arbeiten? Natürlich sind die Funktionen auch Daten.
Ich würde sogar noch weiter gehen und sagen, dass objektorientiertes Programmieren nicht so sehr von den Schlüsselwörtern abhängt, die Ihre Sprache bereitstellt. Sie können objektorientiertes Programmieren in C durchführen, wenn Sie möchten! Tatsächlich verwendet der Linux-Kernel solche Techniken.
Was Sie dem Schlüsselwort class entnehmen können, ist, dass die Sprache diese Art von Konstrukt von Anfang an unterstützt, und dass Sie nicht alle Schritte durchlaufen müssen, um die Funktionalität selbst erneut zu implementieren (was eine ziemlich unterhaltsame Aufgabe ist) selbst!). Ganz zu schweigen von dem syntaktischen Zucker, den Sie vielleicht auch bekommen.
quelle
Natürlich kannst du!
Die Programmiersprache Self ist eine dynamische, prototypbasierte, objektorientierte Sprache, in der alles ein Objekt ist und es keinerlei Sinn für Klassen oder Ähnliches gibt. Es konzentriert sich auf die Idee, prototypische Objekte zu erstellen und diese zu klonen, anstatt Klassen als Vorlagen für die Erstellung von Objekten zu verwenden.
Weitere Informationen erhalten Sie unter http://www.selflanguage.org/ . Ich finde es sehr interessant und wenn Sie OOP mögen, ist es eine gute Idee, etwas zu überprüfen, das nicht so häufig vorkommt.
quelle
Nicht immer: es kommt auf die Sprache an. Sie haben die Fähigkeit demonstriert, dies in Python zu tun, aber (wenn Ihre Frage trotz des Python-Tags sprachunabhängig sein soll), können dies nicht alle Sprachen. Java zum Beispiel kann es meistens nicht. Wenn Sie die Klasse ignorieren, die main enthält, können Sie keine beliebigen Methoden / Felder für ein in main definiertes Objekt ohne das Schlüsselwort class definieren. Obwohl anonyme Klassen vorhanden sind, benötigen sie eine Schnittstelle und können keine öffentlichen Mitglieder außer den in der Schnittstelle definierten haben. Es ist zwar möglich, benutzerdefinierte Schnittstellen zu definieren und dann anonyme Klassen für sie zu erstellen, dies ist jedoch praktisch das Gleiche (aber weniger bequem) als die Verwendung einer Klasse.
Doc Brown hat eine großartige Antwort, aber der Punkt, den ich versuche, ist, dass ich sicher bin, dass es mindestens eine Sprache gibt, die Ihre Lösung überhaupt nicht zulässt.
quelle
class
Schlüsselwort enthalten, daher ist dies keine große Überraschung. Aber Sie könnten durchaus Ihr eigenes Objektsystem auf Javas Objektsystem implementieren, obwohl ich nicht weiß, warum Sie so etwas tun wollen.class
Schlüsselwort verwenden, da die Sprache erfordert, dass Sie Ihre Funktionen in Klassen einteilen. Das ist natürlich extrem theoretisch, aber auch in Java können Sie die Objektorientierung ohne die eingebauten Klassen durchführen!Die Definition Ihres Lehrers geht völlig am wichtigsten Punkt der objektorientierten Programmierung vorbei, was sie nützlich und einzigartig macht. "Message Passing" ist ein Haufen Unsinn, den sich die Smalltalk-Leute ausgedacht haben, und er ist überall dort gescheitert, wo es versucht wurde. Die wahre Stärke von OOP ist die sogenannte Liskov-Substitution . Das Konzept ist zwar recht einfach zu beschreiben und zu verstehen, die zugrunde liegende Implementierung ist jedoch so komplex, dass es ohne die Unterstützung auf Sprachebene im Wesentlichen unmöglich ist, richtig vorzugehen.
Die Idee der Liskov-Substitution ist, dass überall dort, wo Ihr Code eine Variable eines bestimmten Typs erwartet, jeder von diesem Typ abgeleitete Typ akzeptiert und trotzdem korrekt funktioniert, ohne dass Sie die Details des abgeleiteten Typs kennen müssen.
Beispielsweise verwenden GUI-Frameworks überall die Liskov-Substitution. Sie verfügen in der Regel über eine Basisklasse
Control
, die "ein beliebiges Steuerelement" darstellen kann. Dabei handelt es sich um eine Schnittstelle, die grundlegende Aktionen wie Zeichnen, Ändern der Größe und Reagieren auf Benutzereingaben kennt. Wenn Sie auf ein Steuerelement klicken, ruft das UI-Framework eineClick
Methode für das Steuerelement auf, ohne sich darum kümmern zu müssen, um welche Art von Steuerelement es sich handelt, und überlässt es dem Steuerelement, den Klick in der für seine Klasse geeigneten Weise zu behandeln. EinButton
Steuerelement sollte beim Anklicken etwas völlig anderes tun als einTextBox
Steuerelement, um nur ein Beispiel zu nennen.Also ja, Sie können mit dem oben beschriebenen Trick mit verschachtelten Funktionen etwas Ähnliches wie Objekte erstellen, aber da Sie auf diese Weise keine Vererbung und Liskov-Substitution erhalten können, ist dies ein äußerst begrenzter Ersatz für echtes OOP.
quelle
child*
an eine Funktion übergeben, die aparent*
als Argument verwendet, zumindest nicht ohne Typumwandlung.) Schlimmer noch, an C-Strukturen können keine Methoden gebunden sein, und virtuelle Methoden werden nicht unterstützt Was die Magie der Liskov-Substitution ausmacht, ist, dass Sie VMTs von Hand konstruieren müssen. Dies ist ein komplizierter Prozess, der sich leicht vermasseln lässt.Schnelle kurze Antwort
Ja, Programmierer können die objektorientierte Programmierung ohne "Klassen" anwenden.
Langweilige ausführliche beschreibende Antwort
Es gibt verschiedene Variationen von "Objektorientierung". Das erste Konzept, das vielen Programmierern einfällt, ist "Klassen".
Ja, Programmierer können die objektorientierte Programmierung ohne "Klassen" anwenden, sind jedoch auf die Funktionen und Einschränkungen der einzelnen Programmiersprachen beschränkt.
Ihr Beitrag ist mit Python markiert , daher lautet Ihr Fragentitel möglicherweise eher "So implementieren Sie objektorientierte Programmierung ohne Klassen in Python".
Ich verwende derzeit die Phrase "Objekt- und klassenorientierte Programmierung", um anhand anderer Variationen wie Javascripts "Prototyping" oder Visual Basic "Based" oder der Emulation in "Pure C" mithilfe von "Funktoren" zu identifizieren.
quelle