Отделение реализации класса от описания

 
0
 
Python
ava
mkfs | 31.03.2010, 23:15
Как можно отделить реализацию класса от описания?
В С++ это делает так:


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__ для каждого конструктора. Некрасиво как-то...
Kommentare (10)
ava
cutwater | 01.04.2010, 08:41 #
Python это не С++. Запомните это. Так не нужно делать.
ava
mkfs | 01.04.2010, 09:50 #
Цитата


Так не нужно делать.

Эта рекомендация где-то описана? Если нет, то поясните почему так не делают.
ava
cutwater | 01.04.2010, 12:41 #
Цитата (mkfs @ 1.4.2010, 08:50 findReferencedText)
Если нет, то поясните почему так не делают.


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

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

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

Вам следует в первую очередь запомнить для себя что "Python - НЕ С++" и некоторые походы С++ программистов для Python не применимы.
ava
kemiisto | 01.04.2010, 12:52 #
Цитата (mkfs @ 1.4.2010, 10:50 findReferencedText)
Эта рекомендация где-то описана? Если нет, то поясните почему так не делают.

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

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

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

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

Никогда не тащите свои старые (и, кстати, в данном случае ещё и дурацкие) привычки в новый язык.
ava
qweqwe | 01.04.2010, 13:00 #
В с++, реализацию и объявление класса разделяют главным образом для ускорения компиляции. Второстепенно - сокрытие реализации, весьма условное, в срр файле.

В 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 избавляет он необходимости применять наследование, достаточно создать несколько классов, имеющих один и тот же набор методов
ava
mkfs | 01.04.2010, 13:06 #
Ясно. Спасибо за развернутые ответы.
ava
Gunjy | 02.04.2010, 20:30 #
Цитата


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



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


class A:
def public_method(self):
pass

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


Если я вас правильно понял.
ava
mkfs | 07.04.2010, 13:27 #
Цитата


Если я вас правильно понял.

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

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

class CDemo:
def foo(): pass


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


Но эта штука из С++ в Питоне не нужна.
ava
Dagger | 07.04.2010, 16:57 #
обычно интерфейсы реализуют как базовые классы с методами, которые генерят исключение если их вызвать и они не имплеменчены в предках. Что-то типа:


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


ava
Gunjy | 07.04.2010, 19:02 #
Цитата


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



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


Main.py

class A:
def public_method(self):
pass



import Main

class B(Main.A):
def public_method(self):
print "pass"
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  Dagger   qweqwe ava  kemiisto   cutwater   Gunjy   mkfs
advanced
Absenden