Скажем, мы хотим предоставить абстракцию «счета» в банке. Вот один из подходов, использующий function
объект в 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
Вот еще один подход, использующий абстракцию типов (т. class
Е. Ключевое слово в 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
Мой учитель начал тему «Объектно-ориентированное программирование», введя class
ключевое слово и показав нам следующие пункты:
Объектно-ориентированного программирования
Способ организации модульных программ:
- Абстракционные барьеры
- Передача сообщений
- Объединение информации и связанного поведения
Как вы думаете, первого подхода будет достаточно для удовлетворения приведенного выше определения? Если да, зачем нам class
ключевое слово для объектно-ориентированного программирования?
design
object-oriented
python
object-oriented-design
object
overexchange
источник
источник
class
выполняет аналогичную оптимизацию).foo.bar()
обычно идентиченfoo['bar']()
, и в редких случаях последний синтаксис действительно полезен.object['method'](args)
, объекты Python фактически эквивалентныobject['method'](object, args)
. Это становится актуальным, когда базовый класс вызывает методы в дочернем классе, например, в шаблоне стратегии.Ответы:
Поздравляем! Вы заново обнаружили общеизвестный факт, что объектная ориентация может быть осуществлена без специальной поддержки языка программирования. Это в основном то же самое, как объекты вводятся в схему в этом классическом учебнике . Обратите внимание, что в Scheme нет
class
ключевого слова или какого-либо эквивалента, и объекты можно создавать, не имея даже классов.Однако объектно-ориентированная парадигма оказалась настолько успешной, что многие языки - и Python не исключение - предоставляют встроенную поддержку для нее. Это просто для того, чтобы разработчикам было проще использовать эту парадигму и предоставить стандартную форму объектной ориентации для этого языка. По сути, это та же самая причина, по которой многие языки предоставляют
for
цикл, хотя его можно эмулировать, используяwhile
цикл с одной или двумя дополнительными строками кода - просто простота использования .источник
Я бы согласился, что первое определение удовлетворяет трем пунктам, которые сделал ваш учитель. Я не думаю, что нам нужно ключевое слово класса для чего-либо. Под покровом, что еще является объектом, кроме структуры данных с различными типами данных и функциями для работы с данными? Конечно, функции также являются данными.
Я бы пошел еще дальше и сказал, что выполнение объектно-ориентированного программирования не так сильно зависит от ключевых слов, которые предоставляет ваш язык, вы можете заниматься объектно-ориентированным программированием на C, если вы этого хотите! На самом деле ядро Linux использует такие методы.
Из ключевого слова class вы можете сделать вывод, что язык предоставляет поддержку для такого рода конструкций из коробки, и вам не нужно проходить через все циклы, чтобы заново реализовать функциональность самостоятельно (что довольно забавная задача в сам!). Не говоря уже о синтаксическом сахаре, который вы можете получить.
источник
Конечно вы можете!
Язык Self-программирования - это динамический объектно-ориентированный язык, основанный на прототипах, в котором все является объектом, и в нем нет смысла в классах или чем-то еще. Он сфокусирован на идее прототипных объектов и идее клонирования их вместо использования классов в качестве шаблонов создания объектов.
Вы должны проверить http://www.selflanguage.org/ для получения дополнительной информации. Я думаю, что это очень интересно, и если вам нравится ООП, то стоит проверить что-то необычное.
источник
Не всегда: это зависит от языка. Вы продемонстрировали способность делать это в Python, но (если ваш вопрос не зависит от языка, несмотря на тег Python) не все языки могут это делать. Ява, например, в основном не может. Игнорируя класс, содержащий main, невозможно определить произвольные методы / поля для объекта, определенного в main, без ключевого слова class. Хотя анонимные классы существуют, им требуется интерфейс, и они не могут иметь открытых членов, кроме тех, которые определены в интерфейсе. Хотя можно определить пользовательские интерфейсы, а затем создать для них анонимные классы, это фактически то же самое (но менее удобно), чем простое использование класса.
У Дока Брауна есть отличный ответ, но я хочу сказать, что я уверен, что есть хотя бы один язык, который вообще не допускает вашего решения.
источник
class
ключевое слово, так что это неудивительно. Но вы абсолютно могли бы реализовать свою собственную объектную систему поверх объектной системы Java, хотя я не знаю, почему вы хотите сделать такую вещь.class
ключевое слово только потому, что язык требует, чтобы вы поместили свои функции в классы. Конечно, это чрезвычайно теоретически, но даже в Java вы можете сделать объектную ориентацию без встроенных классов!Определение вашего учителя полностью пропускает самый важный момент объектно-ориентированного программирования, то есть то, что делает его полезным и уникальным. «Передача сообщений» - это чепуха, придуманная ребятами из Smalltalk, и везде она проваливалась. Истинная сила ООП - это то, что известно как подстановка Лискова , и, хотя концепция довольно проста для описания и понимания, базовая реализация достаточно сложна, что по существу невозможно сделать правильно без поддержки на уровне языка.
Идея подстановки Лискова заключается в том, что везде, где ваш код ожидает переменную определенного типа, он должен иметь возможность принимать любой тип, производный от этого типа, и при этом работать правильно, не зная деталей о производном типе.
Например, GUI-фреймворки используют подстановку Лискова повсюду. Как правило, они имеют базовый
Control
класс, который может представлять «любой элемент управления», который определяет интерфейс, который знает об основных действиях, таких как рисование, изменение размера и реагирование на ввод пользователя. Если вы щелкнете по элементу управления, инфраструктура пользовательского интерфейса вызоветClick
метод для элемента управления, не заботясь о том, что это за элемент управления, а затем позволит элементу управления обработать щелчок соответствующим образом для своего собственного класса. ЭлементButton
управления должен делать что-то совершенно иное при нажатии, чем элементTextBox
управления, чтобы дать только один пример.Так что да, вы можете создать что-то похожее на объекты, используя описанный выше трюк с вложенными функциями, но поскольку вы не можете получить наследование и подстановку Лискова таким образом, это очень ограниченная замена истинного ООП.
источник
child*
в функцию, которая принимаетparent*
в качестве аргумента a , по крайней мере, без передачи типа.) И что еще хуже, структуры C не могут иметь привязанные к ним методы, и нет поддержки виртуальных методов, которые что заставляет работать магию подстановки Лискова, так что вам приходится создавать VMT вручную, что является сложным процессом, который легко испортить.Быстрый короткий ответ
Да, программисты могут применять объектно-ориентированное программирование без «классов».
Длинный Скучный Обширный Описательный Ответ
Существует несколько разновидностей «объектной ориентации», хотя первое понятие, которое приходит на ум многим программистам, - это «классы».
Да, программисты могут применять объектно-ориентированное программирование без «классов», но оно ограничено возможностями и ограничениями каждого языка программирования.
Ваш пост помечен как Python , поэтому заголовок вашего вопроса может быть больше похож на «Как реализовать объектно-ориентированное программирование без классов в Python».
В настоящее время я использую фразу «объектно-ориентированное программирование», чтобы идентифицировать другие вариации, такие как «Прототипирование» в Javascript, Visual Basic «на основе» или эмуляцию в «Pure C» с использованием «функторов».
источник