Метод абстрагирования и его формы
Абстрагирование означает отвлечение от каких-то свойств, сторон изучаемого явления и одновременно выделение других каких-то свойств. Оно выступает всеобщим методом познания. Это объясняется тем, что реальные объекты обладают множеством свойств, связей, отношений, которые человек не может воспринимать одновременно, поскольку его способности восприятия и мышления ограничены. В силу этого любой человек может постигать объект, упрощая его, выделяя какие-то одни стороны, игнорируя при этом другие, т.е. методом абстрагирования.
Абстрагирование может быть качественным и количественным. Формами качественного абстрагирования выступают: выделение ряда существенных признаков; обособление отдельного признака, который мыслиться как самостоятельное образование; идеализация. Формами количественной абстракции выступают усреднение, алгоритмизация тенденций.
Метод сравнения
Метод сравнения широко используется во всех областях, включая и процесс выработки решений.
С помощью этого метода сравниваются:
отчетные показатели с плановыми,
плановые показатели с возможными,
плановые показатели с показателями предшествующего периода,
показатели организации со среднеотраслевыми и показателями лучших фирм,
фактические действия с установленными нормами,
фактические качества работников (умения, навыки, знания) с требуемыми: способности работников, их потребности, степень удовлетворения потребностей,
цели, нормы, проекты, ресурсы, эффективность,
фактические оценки с декларируемыми,
имеющиеся методы с используемыми методами,
- имеющаяся информация с необходимой для решения проблем,
новые проблемы с уже известными.
Многие теоретические проблемы эффективности, заключающиеся в неопределенности тех или иных ее аспектов – в частности, области применения, виды, способы измерения, – коренятся в недостаточной конкретизации этого понятия, в непроработанности ее классификации. Отсутствие классификации видов эффективности приводит к тому, что общее понятие используется в различных конкретных ситуациях, без учета его модификации. Однако с его помощью принципиально невозможно описать различия между видами эффективности. Более того, общее понятие эффективности является качественным, а потому и не ориентирует на измерение эффективности.
Из сказанного следует, что понятие “эффективность” необходимо конкретизировать. Оно выработано экономической наукой и означает соотношение затрат и результатов деятельности. Экономическое происхождение понятия “эффективность” до сих пор сказывается на степени его разработанности. В частности, можно отметить, что применительно к коммерческим организациям данное явление не только хорошо изучено, но является и объектом управления.
П. Друкер – теоретик эффективного
менеджмента
поэтическое абстрагирование • 101 метод развития креативности
23. 07.2015 vetas
Sticky Post By vetas On 23.07.2015
Что вы слышали о поэтическом абстрагировании? Ха! До сегодняшнего дня вы вообще не слышали про такой метод развития креативности. Возможно, что-то слышали про прогрессирующее абстрагирование Хорста Гешки. Но это не совсем то, потому что сегодняшний метод про поэтов, хотя и немного абстрактных…
Это отличный симбиоз двух явлений, пришедших к нам из Древней Греции (у этой страны было золотое время!). Метод настолько универсальный и рабочий, что применим почти для любых целей: от разработки мощной стратегии чего-угодно (благодаря первому элементу — абстрагированию, переходу от частного к общему), заканчивая разработкой креативных концепций чего-угодно (благодаря поэзии, второму элементу метода). Воспользовавшись раз, пользуюсь и сейчас! Слышали такое?
Как работает поэтическое абстрагирование?
Ключ к решению вашей задачи — иная плоскость её рассмотрения. Вы всегда можете сформулировать свой вопрос иначе, и во время этой формулировки отойти чуть дальше, на более общий уровень. В итоге, вы должны нарисовать офигенный mindmap вашей проблемы, со стихами! Вот вам алгоритм:
1. определите предмет вопроса, напишите про него стих
2. перейдите на один уровень абстракции выше, напишите про него стих
3. есть решение? Отлично!
4. нет решения? см.2
Пример
1. Завелась мышь, а на котов аллергия? Как вывести мышь?
Мышка-мышка-мышка,
Зачем ты завелась?
Подойди поближе,
У тебя есть… мазь?!
2. Мышь — это живое существо (первая абстракция).
Тёплое дыханье,
Ласковый оскал,
Выпьем за знакомство,
Где же твой бокал?!
3. У живых существ есть чувства (вторая абстракция).
Не пищи так грустно,
Щас не до тебя,
На душе так пусто!
Пей давай до дна…
На чувства можно давить! Решение вашей проблемы найдено — надавите на чувства мышке, поговорите с ней, расскажите ей, что обожаете мышек, но почему-то они все у вас дохнут, покажите фотографии дохлых мышей. Включите «Том и Джерри», заплачьте… Думаю, после этого она сама и уйдёт.
Кого взять с собой?
Метод позволяет принимать участие неограниченному количеству людей, но где вы столько возьмёте? Боюсь, даже на всей Земле столько нет. Пригласите для начала digital-стратега BBDO и заведующего Окской птицефабрикой. Что?! Ну хорошо, пригласите кого можете.
Что понадобится?
— свободный лот времени до 60 минут
— временно свободное тихое помещение
— абсолютная свобода мысли
— письменные принадлежности (лучше записывать и зарисовывать ваши мысли)
Какие альтернативы существуют?
— Веер концепций де Боно
— Ментальные карты
— Можно вместо поэзии использовать грейпфрут
Минусы и плюсы
Главный минус — у вас может ничего не получиться с первого раза. С первых нескольких десятков раз. Хорошо-хорошо… Сотен. Главный плюс — это феерически весело и в итоге решение будет найдено! Не сдавайтесь!
Я не призываю вас постоянно пользоваться этим методом. Просто пообещайте мне, что попробуете разок. Вы ничего не потеряете, но многое приобретёте! Пишите мне о своих результатах.
Блок П.П.П.
— представьте, что оно рассказывает вам стих:
— послушайте Кровосток — Куртец
— положите пакет абстракции в корзину
Вот. Теперь всё. Приятных абстракций…
Tagged: абстрагирование, быстрый, Гешка, групповой, одиночный, простой
abc — Абстрактные базовые классы — Документация Python 3.11.1
Исходный код: Lib/abc.py
Этот модуль обеспечивает инфраструктуру для определения абстрактной базы
классы (ABC) в Python, как указано в PEP 3119 ;
см. PEP, почему это было добавлено в Python. (См. также PEP 3141 и
Модуль номеров
, относящийся к иерархии типов для номеров на основе ABC.
Модуль collections
содержит несколько конкретных классов, производных от
азбуки; они, конечно, могут быть получены в дальнейшем. В дополнение collections.abc В подмодуле
есть несколько ABC, которые можно использовать для проверки того,
класс или экземпляр предоставляет определенный интерфейс, например, если он
hashable или если это сопоставление.
Этот модуль предоставляет метакласс ABCMeta
для определения ABC и
вспомогательный класс ABC
для альтернативного определения ABC через наследование:
- класс abc.ABC
Вспомогательный класс, имеющий
ABCMeta
в качестве метакласса. С этим классом, абстрактный базовый класс может быть создан простым производным отАВС
избегая иногда запутанного использования метакласса, например:из abc импорта ABC класс MyABC (ABC): проходить
Обратите внимание, что тип
ABC
по-прежнемуABCMeta
, поэтому наследование отABC
требует обычных мер предосторожности в отношении использование метаклассов, так как множественное наследование может привести к конфликтам метаклассов. Можно также определить абстрактный базовый класс, передав метакласс ключевое слово и используяABCMeta
напрямую, например:из импорта abc ABCMeta класс MyABC (метакласс = ABCMeta): проходить
Новое в версии 3.4.
- класс abc.ABCMeta
Метакласс для определения абстрактных базовых классов (ABC).
Используйте этот метакласс для создания ABC. ABC может быть подклассом напрямую, и затем действует как смешанный класс. Вы также можете зарегистрировать несвязанный бетон классы (даже встроенные классы) и несвязанные ABC как «виртуальные подклассы» — эти и их потомки будут считаться подклассами регистрируемого Азбука встроенная
функция issubclass()
, но регистрация ABC не будет отображаться в их MRO (приказе разрешения метода) и не будет реализации, определенные регистрирующим ABC, могут быть вызваны (даже черезсупер()
). 1Классы, созданные с помощью метакласса
ABCMeta
, имеют следующий метод:- регистр( подкласс )
Зарегистрируйте подкласс как «виртуальный подкласс» этой ABC. За пример:
из abc импорта ABC класс MyABC (ABC): проходить MyABC.register(кортеж) утверждать issubclass (кортеж, MyABC) утверждать isinstance((), MyABC)
Изменено в версии 3.3: возвращает зарегистрированный подкласс, чтобы его можно было использовать в качестве декоратора класса.
Изменено в версии 3.4: Чтобы обнаружить вызовы
register()
, вы можете использовать методФункция get_cache_token()
.
Вы также можете переопределить этот метод в абстрактном базовом классе:
- __subclasshook__( подкласс )
(Должен быть определен как метод класса.)
Проверить, является ли подкласс считается подклассом этого ABC. Это означает что вы можете дополнительно настроить поведение
issubclass
без нужно вызватьregister()
для каждого класса, который вы хотите рассмотреть подкласс АВС. (Этот метод класса вызывается из__subclasscheck__()
метод Азбуки. )Этот метод должен возвращать
True
,False
илиNotImplemented
. Если он возвращаетTrue
, подкласс считается подклассом этого ABC. Если он возвращаетFalse
, подкласс не считается подклассом эту азбуку, даже если она обычно была бы одной. Если он вернетсяNotImplemented
, проверка подкласса продолжается обычным механизм.
Для демонстрации этих концепций посмотрите на этот пример определения ABC:
класс Фу: def __getitem__(я, индекс): ... защита __len__(я): ... защита get_iterator (я): вернуть его (себя) класс MyIterable(ABC): @абстрактный метод защита __iter__(я): в то время как Ложь: урожайность защита get_iterator (я): вернуть себя.__iter__() @классметод защита __subclasshook__(cls, C): если cls MyIterable: если есть ("__iter__" в B. __dict__ для B в C.__mro__): вернуть Истина вернуть нереализованный MyIterable.register(Foo)
ABC
MyIterable
определяет стандартный итерируемый метод,__iter__()
, как абстрактный метод. Данная реализация здесь все еще можно вызывать из подклассов. Методget_iterator()
также является частью абстрактного базового классаMyIterable
, но не имеет для переопределения в неабстрактных производных классах.Определенный здесь метод класса
__subclasshook__()
говорит, что любой класс который имеет__iter__()
в своем__dict__
(или в одном из его базовых классов, доступ к через список__mro__
) также считаетсяMyIterable
.Наконец, последняя строка делает
Foo
виртуальным подклассомMyIterable
, хотя он не определяет метод__iter__()
(он использует итерируемый протокол старого стиля, определенный в терминах__len__()
и__getitem__()
). Обратите внимание, что это не сделаетget_iterator
доступен как методFoo
, поэтому предоставляется отдельно.
Модуль abc
также предоставляет следующий декоратор:
- @abc.abstractmethod
Декоратор, указывающий абстрактные методы.
Для использования этого декоратора требуется, чтобы метакласс класса был
ABCMeta
или происходит от него. Класс, имеющий метакласс, производный отABCMeta
не может быть создан, пока не будут реализованы все его абстрактные методы. и свойства переопределяются. Абстрактные методы можно вызывать с помощью любого нормальных «супер» механизмов вызова.abstractmethod()
можно использовать объявлять абстрактные методы для свойств и дескрипторов.Динамическое добавление абстрактных методов в класс или попытка изменить статус абстракции метода или класса после его создания поддерживается с помощью функции
update_abstractmethods()
.abstractmethod()
влияет только на подклассы, полученные с использованием обычных наследование; «виртуальные подклассы», зарегистрированные в регистре ABC()
метод не влияет.Когда
abstractmethod()
применяется в сочетании с другим методом дескрипторов, он должен применяться как самый внутренний декоратор, как показано на следующие примеры использования:класс С(АВС): @абстрактный метод def my_abstract_method(я, arg1): ... @классметод @абстрактный метод def my_abstract_classmethod (cls, arg2): ... @статический метод @абстрактный метод Def my_abstract_staticmethod (arg3): ... @имущество @абстрактный метод Def my_abstract_property (я): ... @my_abstract_property.setter @абстрактный метод def my_abstract_property (я, значение): ... @абстрактный метод защита _get_x (я): ... @абстрактный метод защита _set_x (я, значение): . .. х = свойство (_get_x, _set_x)
Чтобы правильно взаимодействовать с механизмом абстрактного базового класса, дескриптор должен идентифицировать себя как абстрактный, используя
. Дескриптор класса__isabstractmethod__
. В общем случае этот атрибут должен бытьTrue
если какой-либо из методов, используемых для составления дескриптора, является абстрактным. За Например, встроенное в Python свойство: ... @имущество def __isabstractmethod__(я): вернуть любой (getattr (f, '__isabstractmethod__', False) для f in (self._fget, self._fset, self._fdel))
Примечание
В отличие от абстрактных методов Java, эти абстрактные методы могут иметь реализацию. Эта реализация может быть вызывается через механизм
super()
из класса, который переопределяет его. Это может быть полезно в качестве конечной точки для супервызов во фреймворке, использующем совместный множественное наследование.
Модуль abc
также поддерживает следующие устаревшие декораторы:
- @abc.abstractclassmethod
Новое в версии 3.2.
Устарело, начиная с версии 3.3: теперь можно использовать
classmethod
сabstractmethod()
, что делает этот декоратор излишним.Подкласс встроенного
classmethod()
, указывающий на абстрактный метод класса. В остальном это похоже наabstractmethod()
.Этот особый случай устарел, так как декоратор
classmethod()
теперь правильно идентифицируется как абстрактный при применении к абстрактному метод:класс С(АВС): @классметод @абстрактный метод def my_abstract_classmethod (cls, arg): ...
- @abc.abstractstaticmethod
Новое в версии 3.2.
Устарело, начиная с версии 3.3: теперь можно использовать статический метод
abstractmethod()
, что делает этот декоратор излишним.Подкласс встроенного
staticmethod()
, указывающий на абстрактный статический метод. В остальном это похоже наабстрактный метод()
.Этот особый случай устарел, так как декоратор
staticmethod()
теперь правильно идентифицируется как абстрактный при применении к абстрактному метод:класс С(АВС): @статический метод @абстрактный метод def my_abstract_staticmethod (аргумент): ...
- @abc.abstractproperty
Устарело, начиная с версии 3.3: теперь можно использовать свойство
property.getter()
,property.setter()
иproperty.deleter()
сabstractmethod()
, что делает этот декоратор излишним.Подкласс встроенного
property()
, указывающий на абстрактный имущество.Этот особый случай устарел, так как декоратор
property()
теперь правильно идентифицируется как абстрактный при применении к абстрактному метод:класс С(АВС): @имущество @абстрактный метод Def my_abstract_property (я): . ..
В приведенном выше примере определяется свойство только для чтения; вы также можете определить абстрактное свойство чтения-записи путем соответствующей маркировки одного или нескольких базовые методы как абстрактные:
класс С(АВС): @имущество защита х (я): ... @x.setter @абстрактный метод защита х (я, значение): ...
Если только некоторые компоненты являются абстрактными, только эти компоненты должны быть обновлено для создания конкретного свойства в подклассе:
класс Д(С): @C.x.setter защита х (я, значение): ...
Модуль abc
также обеспечивает следующие функции:
- abc.get_cache_token()
Возвращает текущий токен кэша абстрактного базового класса.
Токен — это непрозрачный объект (поддерживающий проверку на равенство), идентифицирующий текущая версия кэша абстрактного базового класса для виртуальных подклассов. Маркер изменяется при каждом вызове
ABCMeta. register()
на любом ABC.Новое в версии 3.4.
- abc.update_abstractmethods( cls )
Функция для пересчета статуса абстракции абстрактного класса. Этот функция должна быть вызвана, если абстрактные методы класса были реализованы или изменены после его создания. Обычно эта функция должна вызываться из декоратора класса.
Возвращает cls , чтобы разрешить использование в качестве декоратора класса.
Если cls не является экземпляром
ABCMeta
, ничего не делает.Примечание
Эта функция предполагает, что суперклассы cls уже обновлены. Он не обновляет никаких подклассов.
Новое в версии 3.10.
Сноски
- 1
Программистам C++ следует помнить, что виртуальный базовый класс Python концепция отличается от C++.
Абстрактный метод Python и абстрактный класс
Абстрактный метод — это метод, который объявлен, но не имеет реализации такие методы называются абстрактными методами.
В Python мы можем объявить абстрактный метод с помощью декоратора @abstractmethod .
Этот абстрактный метод присутствует в модуле abc в python, и, следовательно, при объявлении абстрактного метода мы должны обязательно импортировать модуль abc.
Пример:
из абстрактного метода импорта abc класс Транспортное средство: @абстрактный метод защита getNoOfWheels (я): pass
Вышеупомянутая программа не имеет реализации, и мы не получим никакого вывода.
Здесь дочерний класс отвечает за реализацию абстрактного метода родительского класса.
Операторы Python
частично реализованные классы называются абстрактными классами; каждый абстрактный класс в Python должен быть дочерним по отношению к классу ABC, который присутствует в модуле abc.
Пример:
из abc import ABC, abstractmethod класс транспортного средства (АВС): @абстрактный метод защита getNoOfWheels (я): пройти
Дочерние классы отвечают за реализацию абстрактных методов родительского класса.
В следующем примере показано создание родительского абстрактного класса, определяющего абстрактный метод, который частично реализован, создавая дочерние классы, отвечающие за реализацию родительского абстрактного класса. Эти классы называются конкретными классами.
Мы не можем создать объект для абстрактного класса, но мы можем создать объект для дочернего класса.
из abc import ABC, abstractmethod класс Транспортное средство (ABC): ## абстрактный класс @abstractmethod ##абстрактный метод защита getNoOfWheels (я): проходить class Bus(Vehicle): ##реализация родительского абстрактного класса с использованием дочернего класса защита getNoOfWheels (я): вернуть 6 class Auto(Vehicle): ##реализация родительского абстрактного класса с использованием дочернего класса защита getNoOfWheels (я): вернуть 3 б=автобус() печать (b.getNoOfWheels()) а=авто() печать(a.getNoOfWheels())
Вывод:
В чем преимущество объявления абстрактного метода в родительском классе
Ответ: Объявив абстрактный метод в дочернем классе, мы можем предоставить некоторые рекомендации для дочерних классов, такие как они должны обязательно применять эти методы; в противном случае дочерний класс воспримет это как необязательный.
, если мы не обеспечим реализацию этого абстрактного метода, тогда Python выдаст ошибку
из abc import ABC, abstractmethod класс транспортного средства (АВС): @абстрактный метод защита getNoOfWheels (я): проходить Класс Автобус(Автомобиль): проходить б=автобус()
Вывод:
Если мы удалим декоратор @abstractmethod, то метод станет обычным методом, и дочерний класс может реализовать его, а может и не реализовать.
из abc import ABC, abstractmethod класс транспортного средства (АВС): защита getNoOfWheels (я): проходить Класс Автобус(Автомобиль): проходить b=Bus()
Вывод: он не выдает никакого вывода, но и не выдает никаких ошибок.
Модули Python
1. Если класс содержит один абстрактный метод и если мы расширяем класс ABC, то создание экземпляра невозможно; на Абстрактный класс с созданием экземпляра абстрактного метода (создание объекта) невозможен .
Рассмотрим приведенный ниже пример , который представляет собой конкретный класс, который не содержит абстрактного метода и абстрактного класса, и, следовательно, мы можем выполнить создание экземпляра объекта
Тест класса: проходить t=Test()
Приведенный ниже пример содержит абстрактный класс, но не включает абстрактный метод, поэтому мы можем выполнить инстанцирование/можем создать объект.
Абстрактный класс может содержать нулевое количество абстрактных методов
из abc import * Тест класса (ABC): проходить t=Test()
И приведенный ниже пример включает один абстрактный класс и абстрактный способ, и, следовательно, мы не можем выполнить создание экземпляра.
из импорта abc * Тест класса (ABC): проходить т = тест () ##Вывод: Файл "C:/Users/User/.spyder-py3/temp.py", строка 6, вт = тест () TypeError: не удается создать экземпляр абстрактного класса Test с абстрактными методами m1
Но следующий пример содержит абстрактный метод и не включает абстрактный класс, поэтому мы можем выполнить создание экземпляра.
из импорта abc * Класс Тест: @абстрактный метод защита m1 (я): проходить t=Test()
2. Если мы создаем дочерний класс для абстрактного класса, то для каждого абстрактного метода родительского класса обязательно необходимо обеспечить реализацию в дочернем классе; в противном случае дочерний класс также становится абстрактным классом, и мы не можем создать объект для дочернего класса.
Следующий пример содержит абстрактный метод с абстрактным классом, но когда мы создаем дочерний класс для абстрактного родительского класса, мы не реализовали родительский абстрактный метод, и поэтому python выдает ошибку, что мы не можем создать объект для что.
из импорта abc * Тест класса (ABC): @абстрактный метод защита m1 (я): проходить подтест класса (тест): проходить s=Подтест() ##Выход: Файл «C:/Users/User/.spyder-py3/temp.py», строка 10, вs=Подтест() TypeError: невозможно создать экземпляр абстрактного класса SubTest с помощью абстрактных методов m1
Следующий пример содержит абстрактный класс с двумя абстрактными методами, когда мы создаем дочерний класс, мы реализуем только один абстрактный метод родительского класса, и, следовательно, мы не можем выполнить создание экземпляра.
из импорта abc * Тест класса (ABC): @абстрактный метод защита m1 (я): проходить @абстрактный метод защита m2 (я): проходить подтест класса (тест): защита m1 (я): print("Метод m1") s=Подтест() с.м1() ##Вывод: Файл «C:/Users/User/.spyder-py3/temp.py», строка 14, вs=Подтест() TypeError: невозможно создать экземпляр абстрактного класса SubTest с помощью абстрактных методов m2
Следующий пример содержит абстрактный класс с двумя абстрактными методами, и в дочернем классе мы реализуем оба метода m1
и m2
, и, следовательно, мы можем создать объект или выполнить инстанцирование.
из импорта abc * Тест класса (ABC): @абстрактный метод защита m1 (я): проходить @абстрактный метод защита m2 (я): проходить подтест класса (тест): защита m1 (я): print("реализация метода m1") защита m2 (я): print("реализация метода m2") s=Подтест() с.