Подтвердить что ты не робот

Как реализовать интерфейсы в python?

public interface IInterface
{
    void show();
}

 public class MyClass : IInterface
{

    #region IInterface Members

    public void show()
    {
        Console.WriteLine("Hello World!");
    }

    #endregion
}

Как реализовать эквивалент Python этого кода на С#?

class IInterface(object):
    def __init__(self):
        pass

    def show(self):
        raise Exception("NotImplementedException")


class MyClass(IInterface):
   def __init__(self):
       IInterface.__init__(self)

   def show(self):
       print 'Hello World!'

Это хорошая идея? Приведите примеры своих ответов.

4b9b3361

Ответ 1

Как уже упоминалось здесь:

Интерфейсы не нужны в Python. Это связано с тем, что Python имеет правильное многократное наследование, а также ducktyping, что означает, что места, где вы должны иметь интерфейсы в Java, вам не нужно иметь их в Python.

Тем не менее, для интерфейсов все еще существует несколько применений. Некоторые из них охватываются базовыми классами Pythons, введенными в Python 2.6. Они полезны, если вы хотите создать базовые классы, которые не могут быть созданы, но предоставить определенный интерфейс или часть реализации.

Другое использование - если вы каким-то образом хотите указать, что объект реализует определенный интерфейс, и вы можете использовать ABC для этого также путем подкласса от них. Другим способом является zope.interface, модуль, который является частью архитектуры компонентов Zope, действительно потрясающе крутой компонентной структуры. Здесь вы не подклассы из интерфейсов, а вместо этого отмечаете классы (или даже экземпляры) как реализацию интерфейса. Это также можно использовать для поиска компонентов из реестра компонентов. Supercool!

Ответ 2

Использование модуля abc для абстрактных базовых классов, похоже, делает трюк.

from abc import ABCMeta, abstractmethod

class IInterface:
    __metaclass__ = ABCMeta

    @classmethod
    def version(self): return "1.0"
    @abstractmethod
    def show(self): raise NotImplementedError

class MyServer(IInterface):
    def show(self):
        print 'Hello, World 2!'

class MyBadServer(object):
    def show(self):
        print 'Damn you, world!'


class MyClient(object):

    def __init__(self, server):
        if not isinstance(server, IInterface): raise Exception('Bad interface')
        if not IInterface.version() == '1.0': raise Exception('Bad revision')

        self._server = server


    def client_show(self):
        self._server.show()


# This call will fail with an exception
try:
    x = MyClient(MyBadServer)
except Exception as exc:
    print 'Failed as it should!'

# This will pass with glory
MyClient(MyServer()).client_show()

Ответ 3

Существуют сторонние реализации интерфейсов для Python (наиболее популярным является Zope's, также используемый в Twisted), но чаще всего кодеры Python предпочитают использовать более богатую концепцию, известную как "Абстрактный базовый класс" (ABC), которая сочетает в себе интерфейс с возможностью иметь некоторые аспекты реализации там тоже. ABC особенно хорошо поддерживаются в Python 2.6 и более поздних версиях, см. PEP, но даже в более ранних версиях Python их обычно рассматривают как "способ to go" - просто определите класс, некоторые из методов которого повышают NotImplementedError, поэтому подклассы будут уведомлены о том, что они лучше переопределяют эти методы! -)

Ответ 4

Что-то вроде этого (возможно, не работает, поскольку у меня нет Python):

class IInterface:
    def show(self): raise NotImplementedError

class MyClass(IInterface):
    def show(self): print "Hello World!"

Ответ 5

Я понимаю, что интерфейсы не нужны в динамических языках, таких как Python. В Java (или С++ с абстрактным базовым классом) интерфейсы являются средством для обеспечения того, что, например, вы передаете правильный параметр, способный выполнять набор задач.

например. если у вас есть наблюдатель и наблюдаемый, наблюдаемый заинтересован в подписке объектов, которые поддерживают интерфейс IObserver, который, в свою очередь, имеет действие notify. Это проверяется во время компиляции.

В Python нет такой вещи, как compile time, а поиск методов выполняется во время выполнения. Более того, можно переопределить поиск с помощью методов __getattr __() или __getattribute __(). Другими словами, вы можете передать в качестве наблюдателя любой объект, который может вернуть вызываемый при доступе к атрибуту notify.

Это приводит меня к выводу, что интерфейсы в Python существуют - это просто их принудительное исполнение откладывается до момента, когда они фактически используются