Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отделение реализации класса от описания 
:(
    Опции темы
mkfs
Дата 31.3.2010, 22:15 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Как можно отделить реализацию класса от описания?
В С++ это делает так:

Код

class CDemo
{
    private:
        int a;

    public:
        int foo();
};

int CDemo:foo()
{
    a = 1;
    return a;
}



Как такое на python'е сделать?

Только варианты типа:
Код

class CDemo():    
    def __init__(self, who): pass

...

def __init__(self, who):
    self.name = who

СDemo.__init__ = __init__
мне не нравятся. Функция __init__() - будет глобальной функцией, может быть совпадение с другими именами. Придётся обертывать в функцию.
Если надо иметь несколько реализаций разных классов в одном модуле, то придется переопределять __init__ для каждого конструктора. Некрасиво как-то...
PM   Вверх
cutwater
Дата 1.4.2010, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Python это не С++. Запомните это. Так не нужно делать.


--------------------
user posted image
PM MAIL   Вверх
mkfs
Дата 1.4.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Цитата

Так не нужно делать.
Эта рекомендация где-то описана? Если нет, то поясните почему так не делают.
PM   Вверх
cutwater
Дата 1.4.2010, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Цитата(mkfs @  1.4.2010,  08:50 Найти цитируемый пост)
Если нет, то поясните почему так не делают. 


Очевидно потому что в Python не существует необходимости и языковой возможности (как следствие из отсутствия такой необходимости) отделения реализации от описания.

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

Добавлено через 2 минуты и 10 секунд
P.S. Советую взглянуть на языки Java, C#, etc. В них тоже нет физической возможности разделения реализации от описания, так как в этом нет необходимости.

Вам следует в первую очередь запомнить для себя что "Python - НЕ С++" и некоторые походы С++ программистов для Python не применимы.


--------------------
user posted image
PM MAIL   Вверх
kemiisto
Дата 1.4.2010, 12:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



Цитата(mkfs @  1.4.2010,  10:50 Найти цитируемый пост)
Эта рекомендация где-то описана? Если нет, то поясните почему так не делают.

Так не делают в языках хоть сколь нибудь поддерживающих модульность. В отличие от тех же C#, Java в Python есть настоящие модули, "содранные"  ЕМНИП с Modula-3. 

В этих самых модулях описываются сущности: функции, классы, ... А интерфейс модуля описывать явно не надо. Эту задачу берёт на себе сам Python. Вообще, интерфейс может генерироваться компилятором (Oberon, Fortran), а может быть какая-нибудь поддержка в run-time через метаинформацию (в Python, видимо, как-то так)... По-разному бывает. Общая черта одна - явно описывать интерфейс модуля не надо.

В случае Java/C# тоже самое справедливо только уже для классов, а не модулей.

А в С/С++ модулей и поддержки модульности нет. Приходится изголяться. 

Никогда не тащите свои старые (и, кстати, в данном случае ещё и дурацкие) привычки в новый язык.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
qweqwe
Дата 1.4.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.1.2007

Репутация: нет
Всего: 0



В с++, реализацию и объявление класса разделяют главным образом для ускорения компиляции. Второстепенно - сокрытие реализации, весьма условное, в срр файле.

В python-e можно использовать фабрику объектов вместо этого(не совсем тоже самое, но обычно это то, что требуется).

Код

class Foo:
    def dothings(self):
        print "fffffuuuuuu"

class Bar:
    def doThings(self):
        print "weeeeee"

def makeFoo(*ac, **av):
    return Foo(*ac, **av)

def makeBar(*ac, **av):
    return Bar(*ac, **av)


duck typing избавляет он необходимости применять наследование, достаточно создать несколько классов, имеющих один и тот же набор методов
PM MAIL   Вверх
mkfs
Дата 1.4.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Ясно. Спасибо за развернутые ответы.
PM   Вверх
Gunjy
Дата 2.4.2010, 20:30 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.5.2009

Репутация: нет
Всего: нет



Цитата

Как можно отделить реализацию класса от описания?


Например через наследование - в классе B переопределяем метод класса A:

Код

class A:
   def public_method(self):
      pass

class B(A):
   def public_method(self):
      print "pass"


Если я вас правильно понял.
PM   Вверх
mkfs
Дата 7.4.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Цитата

Если я вас правильно понял. 
Я привык видеть интерфейс классов и их реализацию в разных файлах.

Я предполагал, что есть что-то типа:
Код

class CDemo:
        def foo(): pass


def CDemo::foo():
    print 'foo'


Но эта штука из С++ в Питоне не нужна.
PM   Вверх
Dagger
Дата 7.4.2010, 16:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

Репутация: 1
Всего: 8



обычно интерфейсы реализуют как базовые классы с методами, которые генерят исключение если их вызвать и они не имплеменчены в предках. Что-то типа:

Код

class Base(object):
    def __init__(self): pass
    def method1(self):
        raise TypeError, "Method not implemented"



PM MAIL WWW Skype   Вверх
Gunjy
Дата 7.4.2010, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.5.2009

Репутация: нет
Всего: нет



Цитата

Я привык видеть интерфейс классов и их реализацию в разных файлах.


Можно воспользоваться импортом:

Код

Main.py

class A:
   def public_method(self):
      pass


Код

import Main

class B(Main.A):
   def public_method(self):
      print "pass"

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.