Этот ответ вдохновил Даниэль М. Эта схема ниже, кажется, дает мне то, что я хочу. Остальное такое же, как у нее.
regex = r'(?<![a-zA-Z])\*{2,}(?![a-zA-Z])'
Пример дан в моем первом классе OO:
Вообразите медиаплеер. Это абстрагирует понятие проигрывания, приостановки, быстрой передачи, и т.д. Как пользователь, можно использовать это для работы устройством.
Ваш VCR реализовал этот интерфейс и скрыл или инкапсулировал детали механических дисков и лент.
Когда новая реализация медиаплеера прибывает (скажите, что DVD-плеер, который использует диски, а не ленты) она может заменить реализацию, инкапсулировавшую в медиаплеере, и пользователи могут продолжить использовать ее, как они сделали с их VCR (те же операции, такие как игра, пауза, и т.д....).
Это - понятие сокрытия информации посредством абстракции. Это позволяет, чтобы детали реализации изменились без пользователей, имеющих необходимость знать, и способствует слабой связи кода.
*отклоняют абстракцию символьных потоков (дисковые файлы, каналы, сокеты, ttys, и т.д.) в единственный объект ("все - файл"), модель позволяет широкому спектру инструментов быть примененным к широкому спектру источников данных / приемники способом, которые просто не были бы возможны без инкапсуляции.
Аналогично, понятие потоков на различных языках, абстрагирующих по спискам, массивам, файлам, и т.д.
Кроме того, понятия как числа (абстрагирующий по целым числам, полудюжине видов плаваний, rationals, и т.д.) воображают то, чем кошмаром это было бы то, если бы высокоуровневому коду дали формат мантиссы и т.д и уехал для отражения для себя.
Почти каждый Java, C# и кодовая база C++ в мире имеют сокрытие информации: это столь же просто как частное: разделы классов.
Внешний мир не видит членов парламента, не занимающих официального поста, таким образом, разработчик может изменить их, не будучи должен волноваться об остальной части кода, не компилирующего.
Что? Вы еще не убеждены?
Легче показать противоположное. Мы раньше писали код, который не имел никакого контроля над тем, кто мог получить доступ к деталям его реализации. Это делало почти невозможным время от времени определить, какой код изменил переменную.
Кроме того, Вы не можете действительно абстрагировать что-то, если каждая часть кода в мире, возможно, возможно зависела от реализации определенных реальных классов.
Я знаю, что ответ уже принят, но я хотел выкинуть еще один: OpenGL/DirectX
Ни один из этих API не является полной реализацией (хотя DirectX, конечно, немного более тяжёлый в этом отношении), но вместо этого используются общие методы передачи команд рендеринга на графическую карту.
Производители карт предоставляют реализацию (драйвер) для конкретной карты, которая во многих случаях очень специфична для аппаратного обеспечения, но вам как пользователю никогда не нужно беспокоиться о том, что один пользователь использует GeForce ABC, а другой - Radeon XYZ, потому что точная реализация скрыта за высокоуровневым API. В противном случае, вам понадобился бы путь к коду в ваших играх для каждой карты на рынке, которую вы хотели бы поддерживать, что было бы совершенно неуправляемо с первого дня. Еще одним большим плюсом такого подхода является то, что Nvidia/ATI может выпустить более новую, эффективную версию своих драйверов, и вы автоматически получаете выгоду, не прилагая усилий с вашей стороны.
Тот же принцип действует в отношении звука, сети, мыши, клавиатуры... практически любого компонента вашего компьютера. Независимо от того, происходит ли инкапсуляция на аппаратном уровне или в программном драйвере, в какой-то момент все особенности устройства скрыты, чтобы вы могли обращаться с любой клавиатурой, например, как с клавиатурой, а не как с Microsoft Ergonomic Media Explorer Deluxe Revision 2.
Когда вы смотрите на это так, быстро становится ясно, что без какой-либо формы инкапсуляции/абстракции компьютеров в том виде, в котором мы их знаем сегодня, просто не работал бы вообще. Это достаточно блестяще для вас?