Powiedzmy, że chcemy przedstawić abstrakcję „konta” w banku. Oto jedno podejście, używając function
obiektu w Pythonie:
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
Oto inne podejście z wykorzystaniem abstrakcji typu (tj. class
Słowa kluczowego w Pythonie):
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
Mój nauczyciel rozpoczął temat „Programowanie obiektowe”, wprowadzając class
słowo kluczowe i pokazując nam następujące punkty:
Programowanie obiektowe
Metoda organizacji programów modułowych:
- Bariery abstrakcji
- Przekazywanie wiadomości
- Łączenie informacji i powiązanych zachowań
Czy uważasz, że pierwsze podejście wystarczyłoby, aby spełnić powyższą definicję? Jeśli tak, dlaczego potrzebujemy class
słowa kluczowego do programowania obiektowego?
design
object-oriented
python
object-oriented-design
object
nadmierna wymiana
źródło
źródło
class
dokonuje podobnej optymalizacji).foo.bar()
jest zwykle identycznafoo['bar']()
, a w rzadkich przypadkach ta ostatnia składnia jest faktycznie przydatna.object['method'](args)
, obiekty Pythona faktycznie odpowiadająobject['method'](object, args)
. Staje się to istotne, gdy klasa podstawowa wywołuje metody w klasie potomnej, np. We Wzorze Strategii.Odpowiedzi:
Gratulacje! Odkryłeś dobrze znany fakt, że orientacji obiektowej można dokonać bez obsługi określonego języka programowania. Jest to w zasadzie taki sam sposób wprowadzania obiektów w Schemacie w tej klasycznej książce . Zauważ, że Schemat nie ma
class
słowa kluczowego ani innego odpowiednika, a obiekty można tworzyć bez równych klas.Jednak paradygmat zorientowany obiektowo był tak skuteczny, że wiele języków - i Python nie jest wyjątkiem - zapewnia wbudowane wsparcie dla niego. Ma to na celu ułatwienie programistom korzystania z paradygmatu i zapewnienie standardowej formy orientacji obiektowej dla tego języka. Jest to zasadniczo ten sam powód, dla którego wiele języków udostępnia
for
pętlę, chociaż można ją emulować za pomocąwhile
pętli z jednym lub dwoma dodatkowymi wierszami kodu - po prostu łatwość użycia .źródło
Zgadzam się, że pierwsza definicja odpowiada trzem punktom, które przedstawił twój nauczyciel. Nie sądzę, żebyśmy potrzebowali słowa kluczowego klasy do czegokolwiek. Czym innym jest obiekt, ale struktura danych z różnymi typami danych i funkcjami do pracy z danymi? Oczywiście funkcje są również danymi.
Chciałbym pójść jeszcze dalej i powiedzieć, że programowanie obiektowe nie zależy tak bardzo od słów kluczowych , jakie zapewnia Twój język, ale możesz programować obiektowo w C, jeśli chcesz! W rzeczywistości jądro Linuksa stosuje takie techniki.
Ze słowa kluczowego class można wywnioskować, że język zapewnia obsługę tego rodzaju konstrukcji od razu po wyjęciu z pudełka i nie trzeba przechodzić przez wszystkie czynności, aby samodzielnie wdrożyć tę funkcję (co jest dość zabawnym zadaniem w samo!). Nie wspominając już o całym cukrze syntaktycznym, który możesz dostać.
źródło
Oczywiście, że możesz!
Język samoprogramowania jest dynamicznym, obiektowym językiem zorientowanym na prototypy, w którym wszystko jest przedmiotem i nie ma poczucia klas ani w ogóle. Koncentruje się na idei prototypowych obiektów i klonowaniu ich zamiast klas jako szablonów tworzenia obiektów.
Aby uzyskać więcej informacji, sprawdź http://www.selflanguage.org/ Myślę, że jest to bardzo interesujące i jeśli lubisz OOP, dobrym pomysłem jest sprawdzenie czegoś, co nie jest tak powszechne.
źródło
Nie zawsze: zależy od języka. Udowodniłeś, że potrafisz to zrobić w Pythonie, ale (jeśli twoje pytanie ma być niezależne od języka pomimo znacznika Python), nie wszystkie języki mogą to zrobić. Na przykład Java najczęściej nie może. Ignorując klasę zawierającą main, nie można zdefiniować dowolnych metod / pól w obiekcie zdefiniowanym w main bez słowa kluczowego class. Chociaż istnieją anonimowe klasy, wymagają one interfejsu i nie mogą mieć żadnych publicznych członków oprócz tych zdefiniowanych w interfejsie. Chociaż możliwe jest zdefiniowanie niestandardowych interfejsów, a następnie utworzenie dla nich anonimowych klas, jest to faktycznie takie samo (ale mniej wygodne) niż zwykłe użycie klasy.
Doc Brown ma świetną odpowiedź, ale próbuję wyjaśnić, że jestem pewien, że istnieje co najmniej jeden język, który w ogóle nie pozwoli na twoje rozwiązanie.
źródło
class
słowo kluczowe, więc nie jest to niespodzianką. Ale absolutnie możesz zaimplementować swój własny system obiektowy na systemie obiektowym Java, chociaż nie wiem, dlaczego chcesz to zrobić.class
słowa kluczowego tylko dlatego, że język wymaga, aby umieścić swoje funkcje w klasach. Oczywiście jest to niezwykle teoretyczne, ale nawet w Javie możesz wykonywać Object Orientation bez wbudowanych klas!Definicja twojego nauczyciela całkowicie pomija najważniejszy punkt programowania obiektowego, co sprawia, że jest on użyteczny i wyjątkowy. „Przekazywanie wiadomości” to bzdury wymyślone przez ludzi z Smalltalk, a wszędzie tam, gdzie próbowano, ponieśli porażkę. Prawdziwa moc OOP jest czymś znanym jako substytucja Liskowa i chociaż koncepcja jest dość prosta do opisania i zrozumienia, podstawowa implementacja jest na tyle złożona, że w zasadzie nie da się zrobić dobrze bez wsparcia na poziomie językowym.
Idea podstawienia Liskowa polega na tym, że wszędzie tam, gdzie kod oczekuje zmiennej określonego typu, powinien być w stanie zaakceptować dowolny typ pochodzący z tego typu i nadal działać poprawnie bez konieczności znajomości szczegółów typu pochodnego.
Na przykład frameworki GUI używają wszędzie podstawienia Liskov. Zwykle mają
Control
klasę podstawową, która może reprezentować „dowolną kontrolę”, która definiuje interfejs, który wie o podstawowych działaniach, takich jak rysowanie, zmiana rozmiaru i reagowanie na dane wejściowe użytkownika. Jeśli klikniesz formant, środowisko interfejsu użytkownika wywołaClick
metodę na formancie bez konieczności dbania o to, jaki to jest typ kontroli, a następnie pozwól formancie obsługiwać kliknięcie w odpowiedni sposób dla własnej klasy.Button
Kontrola powinna zrobić coś zupełnie innego po kliknięciu niżTextBox
kontrolą, aby podać tylko jeden przykład.Tak więc, możesz stworzyć coś podobnego do obiektów za pomocą sztuczki z zagnieżdżonymi funkcjami opisanej powyżej, ale ponieważ nie możesz w ten sposób uzyskać dziedziczenia i podstawienia Liskova, jest to bardzo ograniczony zamiennik prawdziwego OOP.
źródło
child*
do funkcji, która przyjmujeparent*
argument jako argument, przynajmniej nie bez rzutowania typu). Co gorsza, struktury C nie mogą mieć powiązanych z nimi metod i nie ma obsługi metod wirtualnych , które są co sprawia, że magia substytucji Liskowa działa, więc trzeba ręcznie konstruować VMT, co jest skomplikowanym procesem, który łatwo spieprzyć.Szybka krótka odpowiedź
Tak, programiści mogą stosować programowanie obiektowe bez „klas”.
Długa nudna wyczerpująca odpowiedź opisowa
Istnieje kilka odmian „orientacji obiektowej”, jak sądzono, pierwszą koncepcją, która przychodzi na myśl wielu programistów, są „klasy”.
Tak, programiści mogą stosować programowanie obiektowe bez „klas”, ale są ograniczone do funkcji i ograniczeń każdego języka programowania.
Twój post jest oznaczony jako Python , dlatego tytuł pytania może przypominać „Jak zaimplementować programowanie obiektowe bez klas w Pythonie”.
Obecnie używam wyrażenia „Programowanie zorientowane obiektowo i klasowo”, aby zidentyfikować na podstawie innych odmian, takich jak „Prototypowanie” Javascript lub „Podstawowy” Visual Basic lub emulacja w „Pure C” za pomocą „funktorów”.
źródło