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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полиморфизм, Как сделать? 
V
    Опции темы
HellanD
Дата 13.9.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Скажите такой вопрос!
Я делаю клас и хочу что б в зависимости от числа переменных переданных в него вызывался один или другой конструктор. Как это реализовать и есть ли такая возможность?


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
albertn
Дата 13.9.2006, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

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



Я бы сделал так:
Код

class bla:
    def __init__(self,a=None,b=None,c=None):
        if a is None:
            print 0
        elif b is None:
            print 1
        elif c is None:
            print 2
        else:
            print 3

PM WWW ICQ   Вверх
HellanD
Дата 13.9.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А вот можно чтоб как в С++ можно было вообще разные параметры передавать?
Ну для одних параметров один конструктор для других - другой?



--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
PyS
Дата 13.9.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 21.8.2006
Где: г. Алматы (Казахс тан)

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



Цитата(HellanD @  13.9.2006,  12:05 Найти цитируемый пост)

Я делаю клас и хочу что б в зависимости от числа переменных переданных в него вызывался один или другой конструктор.


Код

class T:
    def __init__(self, **kw):
        l1=[setattr(self, x[0], x[1]) for x in kw.items()]
        if l1: print 0
        else: print len(l1)
a=T(a=None, b=[], c={}, x=1, y=2.0, s=u'трам-тра-та-там')


Добавлено @ 09:52 
Цитата(HellanD @  13.9.2006,  12:51 Найти цитируемый пост)
А вот можно чтоб как в С++ можно было вообще разные параметры передавать?
Ну для одних параметров один конструктор для других - другой?


HellanD,  пожалуйсьа, пример кода в C++! smile
PM MAIL   Вверх
HellanD
Дата 13.9.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Компилятора С у меня на работе нету :-(
Напишу код на питоне (Я хотел бы что б он работал так же как и С++ код а по этому взял конструкции из С++)
Код

class Lodar:
    def __init__(self):
        print "Lod1"

    def __init__(self,lom):
        print "Lod2"

X=Lodar()        

Если это было бы в С++ то при например таком вызове конструктора класа:
X=Lodar()   

получали бы print "Lod1"
А при X=Lodar("БлаБлаБла")
получали бы print "Lod2"

Спасибо за ответ!
  


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
albertn
Дата 13.9.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

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



Код

class Lodar:
    def __init__(self,lom=None):
        if lom is None:
            self.lod1()
        else:
            self.lod2(lom)

    def lod1(self):
        print "Lod1"

    def lod2(self,lom):
        print "Lod2"

PM WWW ICQ   Вверх
HellanD
Дата 13.9.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



albertn:
Смотри тут есть одна проблемма например класс
Код

class Admin:
    def __init__(self,params=None,cert=None,CurvName=None,dke=None,outform=None):
        if params is None:
         self.param=paramCls.param(self,CurvName,dke,outform,mark).generate()
        self.cert=cert
        self.sereal=0


В идеале надо просмотреть кипу параметров.
Если например параметры(params) не переданы то должны быть переданы тогда:CurvName=None,dke=None,outform=None
И тогда конструктор будет иметь вид(во время вызова):
  def __init__(self,CurvName=None,dke=None,outform=None)
И получится что он будет думать что CurvName это params (ему то ниче вообще не мешает так думать)
Да обьявление переменных без укахзания типов имеет кроме очевидных плюсов еще и минусы(ну по крайней мере один, как мне кажеться)
А может тогда передавать в конструктор данные так
А=Admin(None,None,CurvName,dke,outform)??


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
PyS
Дата 13.9.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 21.8.2006
Где: г. Алматы (Казахс тан)

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



HellanD,  как в С++, я думаю не получить, т.к. второй __init___ будет "затирать" первый конструктор. Как выход используй:
Код

class T:
    def __init__(self, *arg, **kw):
        li1=kw.items()
        l1=[setattr(self, x[0], x[1]) for x in li1]
        l=filter(lambda x: type(x)==type((1,1))and x[0]=='metod',arg)
        x = l and l[0][1] or 'print0'
        eval('self.%s()'%x)
    def print0(self):
        print 0
    def print_a(self):
        print getattr(self, 'a', 'Error!!!')
a1=T(('metod', 'print_a'), a=10)
a2=T()



10
0


проверил - должно работать! smile
PM MAIL   Вверх
albertn
Дата 13.9.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

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



Цитата(HellanD @ 13.9.2006,  10:23)
albertn:
Смотри тут есть одна проблемма например класс
Код

class Admin:
    def __init__(self,params=None,cert=None,CurvName=None,dke=None,outform=None):
        if params is None:
         self.param=paramCls.param(self,CurvName,dke,outform,mark).generate()
        self.cert=cert
        self.sereal=0


В идеале надо просмотреть кипу параметров.
Если например параметры(params) не переданы то должны быть переданы тогда:CurvName=None,dke=None,outform=None
И тогда конструктор будет иметь вид(во время вызова):
  def __init__(self,CurvName=None,dke=None,outform=None)
И получится что он будет думать что CurvName это params (ему то ниче вообще не мешает так думать)
Да обьявление переменных без укахзания типов имеет кроме очевидных плюсов еще и минусы(ну по крайней мере один, как мне кажеться)
А может тогда передавать в конструктор данные так
А=Admin(None,None,CurvName,dke,outform)??

Я не совсем понял, что ты имеешь ввиду. Приведу пример, чтоб тебе было понятней:
Код

class Admin:
    def __init__(self,params=None,cert=None):
        if params is not None:
            print "params=",params
        if cert is not None:
            print "cert=",cert

a1 = Admin()
# Ничего не выведет
a2 = Admin(123)
# params= 123
a3 = Admin(123,456)
# params= 123
# cert= 456
a2_2 = Admin(params=123)
# params= 123
a3_2 = Admin(params=123,cert=456)
# params= 123
# cert= 456
a4 = Admin(cert=456)
# cert= 456

PM WWW ICQ   Вверх
HellanD
Дата 13.9.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибки теперь ясно стало!!


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
Artemios
Дата 13.9.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



Цитата(HellanD @  13.9.2006,  10:23 Найти цитируемый пост)
А может тогда передавать в конструктор данные так
А=Admin(None,None,CurvName,dke,outform)?? 
 


A = Admin(CurvName=CurvName,dke=dke,outform=outform)

albertn хорошо показал.

Это сообщение отредактировал(а) Artemios - 13.9.2006, 11:01


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 13.9.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

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



Цитата(Artemios @  13.9.2006,  17:58 Найти цитируемый пост)
A = Admin(CurvName=CurvName,dke=dke,outform=outform) 

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


 




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


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

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