Абстрактные методы в Python

У меня возникли проблемы с использованием наследования с Python. Хотя концепция кажется мне слишком простой для Java, но до сих пор я не мог понять в Python, что удивительно для меня, по крайней мере.

У меня есть прототип, который следует за:

class Shape(): def __init__(self, shape_name): self.shape = shape_name class Rectangle(Shape): def __init__(self, name): self.shape = name 

В приведенном выше коде я могу сделать абстрактный метод, который должен быть реализован для всех подклассов?

  • добавить новый столбец в существующий файл csv
  • Как бы вы создали строку с разделителями-запятыми из строки результатов pyobbc?
  • Установка пакета .whl Python в определенный каталог, отличный от стандартного
  • Функция вызова Python с пользовательского ввода
  • Могу ли я передавать аргументы командной строки на Abaqus python?
  • Как получить NaN, когда я делюсь на ноль
  • Каков наилучший способ получить список запущенных процессов в unix с python?
  • Подсчет строк, слов и символов в текстовом файле с использованием Python
  • 7 Solutions collect form web for “Абстрактные методы в Python”

    Что-то в этом направлении, используя ABC

     import abc class Shape(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def method_to_implement(self, input): """Method documentation""" return 

    Также прочитайте этот хороший учебник: http://www.doughellmann.com/PyMOTW/abc/

    Вы также можете проверить zope.interface, который использовался до введения ABC в python.

    Перед введением ABC вы бы часто это видели.

     class Base(object): def go(self): raise NotImplementedError("Please Implement this method") class Specialized(Base): def go(self): print "Consider me implemented" 

    См. Модуль abc . В основном, вы определяете __metaclass__ = abc.ABCMeta в классе, а затем украшаете каждый абстрактный метод с помощью @abc.abstractmethod . Классы, полученные из этого класса, затем не могут быть созданы, если только все абстрактные методы не были отменены.

    Если ваш класс уже использует метакласс, ABCMeta его из ABCMeta а не type и вы можете продолжать использовать свой собственный метакласс.

    Дешевая альтернатива (и лучшая практика перед введением модуля abc ) заключалась бы в том, чтобы все ваши абстрактные методы просто NotImplementedError к исключению ( NotImplementedError – хороший), так что классы, полученные из него, должны были бы переопределить этот метод, чтобы быть полезным.

    Тем не менее, решение abc лучше, потому что оно не позволяет экземплярам вообще создавать экземпляры (т. Е. «Не работает быстрее»), а также потому, что вы можете предоставить стандартную или базовую реализацию каждого метода, который может быть достигнут с помощью функции super() функция в производных классах.

    Вы не можете, с языковыми примитивами. Как уже было сказано, пакет abc предоставляет эту функциональность в Python 2.6 и более поздних версиях, но нет вариантов для Python 2.5 и ранее. Пакет abc не является новой функцией Python; вместо этого он добавляет функциональность, добавляя явное «говорит ли этот класс, что он это делает?» проверки с проверками согласованности вручную, чтобы вызвать ошибку при инициализации, если такие объявления сделаны ложно.

    Python – это воинственно динамически типизированный язык. Он не указывает языковые примитивы, чтобы вы могли запретить компиляцию программы, поскольку объект не соответствует требованиям типа; это можно обнаружить только во время выполнения. Если вам требуется, чтобы подкласс реализовал метод, документируйте это, а затем просто вызовите метод в слепой надежде, что он будет там.

    Если он там, фантастический, он просто работает; это называется утиным набором текста , и ваш объект достаточно смещен, как утка, чтобы удовлетворить интерфейс. Это прекрасно работает даже в том случае, если self является объектом, к которому вы вызываете такой метод , для целей обязательных переопределений из-за базовых методов, которые нуждаются в конкретных реализациях функций (общих функций), потому что self – это соглашение, а не что-то действительно специальное ,

    Исключение составляет __init__ , потому что, когда вы вызываете ваш инициализатор, инициализатор производного типа не имеет, поэтому он не имел возможности сшивать свои собственные методы на объекте.

    Если бы метод не был реализован, вы получите AttributeError (если его вообще нет) или TypeError (если что-то по этому имени есть, но это не функция или у нее нет этой подписи). Это зависит от вас, как вы справляетесь с этим: либо называть его ошибкой программиста, либо разрешать ему сбой программы (и она должна «быть очевидной для разработчика python, что вызывает такую ​​ошибку там – неудовлетворенный интерфейс утки»), либо улавливать и обрабатывать эти исключения, когда вы обнаружите, что ваш объект не поддерживает то, что вы пожелаете. Обход AttributeError и TypeError важен во многих ситуациях.

    Абстрактные базовые классы – глубокая магия. Периодически я внедряю что-то, используя их, и удивляюсь своей собственной хитрости, очень скоро после этого я полностью смущен своей собственной ловкостью (это может быть просто личным ограничением).

    Другой способ сделать это (должен быть в python std libs, если вы спросите меня) – сделать декоратор.

     def abstractmethod(method): """ An @abstractmethod member fn decorator. (put this in some library somewhere for reuse). """ def default_abstract_method(*args, **kwargs): raise NotImplementedError('call to abstract method ' + repr(method)) default_abstract_method.__name__ = method.__name__ return default_abstract_method class Shape(object): def __init__(self, shape_name): self.shape = shape_name @abstractmethod def foo(self): print "bar" return class Rectangle(Shape): # note you don't need to do the constructor twice either pass r = Rectangle("x") r.foo() 

    Я не писал декоратора. Мне просто пришло в голову, что у кого-то будет. Вы можете найти его здесь: http://code.activestate.com/recipes/577666-abstract-method-decorator/ Хороший jimmy2times. Обратите внимание на обсуждение в нижней части этой страницы. (Это может быть исправлено с помощью модуля проверки, если кто-либо был так склонен).

    Вы должны реализовать абстрактный базовый класс (ABC).

    Проверка документов python

    Вы можете использовать шесть и abc для эффективного построения класса для python2 и python3 следующим образом:

     import six import abc @six.add_metaclass(abc.ABCMeta) class MyClass(object): """ documentation """ @abc.abstractmethod def initialize(self, para=None): """ documentation """ raise NotImplementedError 

    Это авторский документ.

    Python - лучший язык программирования в мире.