• Создание C++-like интерфейса в Python3?

    KirillHelm
    @KirillHelm Автор вопроса
    Andy_U, согласен, использовал именно её, это решение моей проблемы.
  • Создание C++-like интерфейса в Python3?

    KirillHelm
    @KirillHelm Автор вопроса
    Andy_U пример прикреплен в описании вопроса. Я прошу прощения, если оно оказалось не совсем ясно.
    Я попытаюсь объяснить по понятнее (:

    Суть проблемы такова: api конкретного компонента должен быть представлен ввиде отдельного класса-интерфейса (которых хранится в отдельной папке api), а реализация - отдельно (хранится в папке src).

    Я принял решение реализовать это так:

    1. Сделать базовый абстрактный интерфейсный класс, именно от него нужно наследоваться классом интерфейса:

    Path: /interfacebase.py
    Source:
    class InterfaceBase(object):
       @staticmethod
       def create(*args): raise NotImplementedError


    2. Создаю собственно говоря API-класс
    Path: /api/interface.py
    Source:
    from interfacebase import InterfaceBase
    from implementation import CImplementation # импортим имплементацию что бы (см. ниже)
    # с этим инклюдом у нас и открывается кольцо
    class IInterface(InterfaceBase):
       def create(*args): return CImplementation() # через статик интерфейса её можно было создать
       def method(self): raise NotImplementedError


    3. Создаю реализацию:
    Path: /src/implementation.py
    Source:
    # class IInterface(): pass # forward declaration не работает :(
    from interface import IInterface # в таком случаи импортим (тут то и замыкается кольцо)
    class CImplementation(IInterface): #Наследуемся от интерфейса для полиморфизма метода method
       def method(self): print("CClass::method()")


    Как уже сказал, что бы реализовать полиморфизм в методе method, необходмо отнаследоваться от интерфейса, но если сделать импорт, то ничего не выйдет (ошибка ниже), по тому, что мы уже заинклюдили имплементацию в интерфейс, тут то и циклическая зависимость.

    Output:
    Traceback (most recent call last):
      File "main.py", line 1, in <module>
        from interface import IInterface
      File "/api/interface.py", line 2, in <module>
        from implementation import CImplementation
      File "/src/implementation.py", line 1, in <module>
        from interface import IInterface
    ImportError: cannot import name 'IInterface'
  • Создание C++-like интерфейса в Python3?

    KirillHelm
    @KirillHelm Автор вопроса
    longclaps, снова не о чем :)
    Интерфейсов как сказал Andy_U действительно нет ни что в питоне, ни что в плюсах. Я тебя удивлю, но в плюсах тоже все "интерфейсы" делаются на абстрактных классах и в питоне подход точно такой же.

    Если бы ты читал внимательно, то было бы видно, что я спрашиваю как реализовать замену forward-declaration, которая есть в плюсах и которой нет в питоне (я имею ввиду, что я вкурсе был об этом на момент задания вопроса и написал об этом). А спрашивал, по тому, что:
    > Меня интересует как реализовать адекватный импорт без цикличной зависимости.

    Вопрос довольно конкретный, а не ОБЩИЙ.

    Если значешь как решать данный issue - отпишись, иначе же, не пиши сюда больше коменты пожалуйста, по тому, что это уже спам, спасибо!
  • Создание C++-like интерфейса в Python3?

    KirillHelm
    @KirillHelm Автор вопроса
    longclaps, я не спрашивал что такое абстрактный класс, это я прекрассно знаю) Причем исключение в данном случаи это фишка реализации питона, в каждом языке она своя.
    Спасибо конечно за ответ, но ответ не ответ, если писать 1,2,3... Тут либо общайтесь диаграмами, либо кодм, либо понятными выражениями. Спасибо.
  • Создание C++-like интерфейса в Python3?

    KirillHelm
    @KirillHelm Автор вопроса
    longclaps, можите пояснить, пожалуйста, не цифрами а названиями Interface, Implementation итд.?
    Цифрами вообще ничего не понятно, чем занимается абстрактный класс, что за наследники, почему их три...
  • Создание C++-like интерфейса в Python3?

    KirillHelm
    @KirillHelm Автор вопроса
    Это замечательно, но вопрос не в том как обозначить метод)
    Вопрос в том, что класс имплементации наследуется не от интерфейса, а от:
    class IInterface(): pass
    Так как в питоне не работает forward-declaration, а заинклюдить файл интерфейса что бы отнаследовать от него имплементацию не могу, по тому, что получается цикличная зависимость инклюдов (импортов), которую питон решить не может (см. по имплементации: я импорчу имплементацию в интерфейс, что бы можно было вернуть обьект в методе create()).

    Вот я и спрашиваю, как решить данную проблему (:
  • Как правильно сделать цепочки вызовов методов одного класса?

    KirillHelm
    @KirillHelm
    Если не изменяет память, Маерс говорил, что лучше всегда использовать ссылку вместо указателя, это во первых. Как минимум себе убераем несколько способов выстрелить в ногу типа delete по этому указателю сделать. Так же если ты будешь возращать значение - четсно говоря не понятно тогда смысл класса, если в нем нет статических переменных, то его екземпляр будет вести себя скорее всего не совсем так как ты хочешь. Если говорить про сложность конструктора копирования, то он не сложнее пареной репы, такой же как и остальные конструкторы. Просто у него один параметр и это твой же класс, лучше делать это так:
    MyClass(const MyClass& object);
    С точки зрения читабильности кода, лучше не писать в строчку функции, чаще всего будет не читаемо.
    К слову профита от этого в принципе мало. Лучше писать больше строчек кода, но таких что бы было понятно что происходит, чем мало, но не ясно что и зачем.
  • Почему не работает setlocale() в с++ в netbeans?

    KirillHelm
    @KirillHelm
    Не понятно, ты компилируешь и через IDE и мануально или просто запускаешь консольное приложение?
    А компилятор то какой? (:
    Собственно говоря, код то можно сюда?)
  • Почему CMake не генерирует файлы под MinGW без CMAKE_GNUtoMS флага?

    KirillHelm
    @KirillHelm Автор вопроса
    Дополнение к вопросу, обнаружил, что если сразуже запустить повторно команду cmake -G "MinGW Makefiles - генерирует все без проблем. Тогда ещё больше вопросов :)
    Почему с первого раза конфигурация не проходит? Чем обусловленно фейл в первой сессии и почему его нет и все фиксется во второй?)
  • Как разрядить наелектризованный компьютер?

    KirillHelm
    @KirillHelm Автор вопроса
    Леонид, К сожалению нет, офис же)
  • Как разрядить наелектризованный компьютер?

    KirillHelm
    @KirillHelm Автор вопроса
    Игорь Максимов, Спасибо) Но вроде не я, тут проблема в том, что не я один от этого страдаю) Все кто с ними взаимодействует, что сводит к минимуму шанс того, что все работники - наелектризованные)
  • Как разрядить наелектризованный компьютер?

    KirillHelm
    @KirillHelm Автор вопроса
    Корпус - стальной, открытый, по факту я бы это даже стендом назвал. Слишком часто прийдется косаться стенок, буквально 2 перезапуска машины (со стартом блока питания) и она снова готова к бою. А гоняем её так порой и по 4-6 раз за час. То есть хочется как-то автоматизировать процесс или свести взаимодействие к минимуму.
  • Как разрядить наелектризованный компьютер?

    KirillHelm
    @KirillHelm Автор вопроса
    Я бы тоже рад, но такой возможности нет. Оффис без заземления центрального в сети)
  • Как обрабатывать все элементы макроса?

    KirillHelm
    @KirillHelm Автор вопроса
    res2001, спасибо, печально конечно
  • Как обрабатывать все элементы макроса?

    KirillHelm
    @KirillHelm Автор вопроса
    Да наверное как-то можно, вопрос скорее не в решении самой задачи, её то можно решить многими способами. Просто наткнулся на макрос с большим кол-вом аргументов и интересно, можно ли как-то каждый из них обработать (:
  • Как обрабатывать все элементы макроса?

    KirillHelm
    @KirillHelm Автор вопроса
    Т.Е. обработать каждый член __VA_ARGS__ нет никакой возможности?
  • Как в QT получить HTML страницу с выполненным JavaScript?

    KirillHelm
    @KirillHelm
    Impeeeery, да нет, не учил я его несколько лет) Но сочувствую вашей жалкой сюдьбе, если такое пришлось испытать)
  • Как в QT получить HTML страницу с выполненным JavaScript?

    KirillHelm
    @KirillHelm
    Impeeeery, вы что-то очень радикальны. В некоторых облостях он ещё как востребован, особенно во встроенных системах, в связке типа MVC.