Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2014 16:21:10

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

перегрузка наследованных методов

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

class A(object):
    def foo(self, string):
        print string
class B(A):
    def Foo(self, string):
        string = "world"
        self.foo(string)
B().Foo("hello")
А сейчас нашел один способ с использованием дескриптора super, вот код:
class A(object):
    def foo(self, string):
        print string
class B(A):
    def foo(self, string):
        string = "world"
        super(B, self).foo(string)
B().foo("hello")
Очень удобно и прозрачно получается.
Ваши коментарии по этому поводу.



Отредактировано lobster (Март 11, 2014 17:32:39)

Офлайн

#2 Март 11, 2014 16:38:13

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

перегрузка наследованных методов

lobster
Я ничего не понял

Офлайн

#3 Март 11, 2014 17:08:52

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

перегрузка наследованных методов

lobster
К сожалению не могу привести источник, но внем говорили о том что питон не поддерживает перегрузку методов и функции.

ООП -> полиморфизм



Отредактировано Budulianin (Март 11, 2014 17:14:04)

Офлайн

#4 Март 11, 2014 17:25:23

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

перегрузка наследованных методов

Это переопределение метода, а не перегрузка.

Офлайн

#5 Март 11, 2014 17:41:34

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

перегрузка наследованных методов

Singularity
lobster
Я ничего не понял
Суть в том чтобы вызывать стандартные методы по тем же именам но немного измененные в механизме, удобно добавить какую-нибудь дополнительную проверку к стандартным методам или повесить исключение на че нибудь, чтобы это не отвлекало в клиентском коде.
sergeek
Это переопределение метода, а не перегрузка.
Ясно, спасибо. Вопрос снят.



Офлайн

#6 Март 11, 2014 20:20:20

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

перегрузка наследованных методов

Перегрузка это “имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.”

В питоне не:

def a(int b):
    return b+2
def a(float b):
    return b+3
а:
def a(int b):
    if(type(b) is int):
         return b+2
    if(type(b) is float):
         return b+2
т.е. сам питон не будет вести поиск функции по типам аргументов.



Офлайн

#7 Март 12, 2014 01:13:53

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

перегрузка наследованных методов

т.е. сам питон не будет вести поиск функции по типам аргументов.
А ну, потому что динамические типы
Вот тут еще, хотел применить этот метод с модулем pycurl, получились рога:
TypeError: Error when calling the metaclass bases
cannot create 'builtin_function_or_method' instances
Потом немного погодя до меня дошло выполнить type(pycurl.Curl), в принципе он мне и вернул:
<type ‘builtin_function_or_method’> что говорит о том что это нифига не класс а функция или метод, полазив в сети нашел вот такой способ:
import pycurl
import StringIO
class CustomCurl(object):
    def __init__(self):
        self.response = StringIO.StringIO()
        self.curl = pycurl.Curl()
        self.setopt(pycurl.URL, "http://www.myip.ru/ru-RU/index.php")
        self.setopt(pycurl.WRITEFUNCTION, self.response.write)
        
    def perform(self):
        self.curl.perform()
        return self.response.getvalue()
    
    def __getattr__(self, name):
        return getattr(self.curl, name)
ne = CustomCurl()
print ne.perform()
В случае если метод не определен в классе он будет возвращатся из созданного объекта, строчка : return getattr(self.curl, name)



Отредактировано lobster (Март 12, 2014 01:18:11)

Офлайн

#8 Март 12, 2014 01:33:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

перегрузка наследованных методов

doza_and
Перегрузка это “имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.”
типами и/или количеством

у какой-нибудь версии может вообще не быть аргументов
#include <iostream>

using namespace std;

void func();
void func(int);
void func(int, int);
void func(int, double);

int main()
{
func();
func(1);
func(1, 1);
func(1, 1.0);
return 0;
}

void func()
{
cout << "func" << endl;
}

void func(int arg1)
{
cout << "func 1i" << endl;
}

void func(int arg1, int arg2)
{
cout << "func 1i 2i" << endl;
}

void func(int arg1, double arg2)
{
cout << "func 1i 2d" << endl;
}
[guest@localhost examples]$ .iso++ overload.cpp -o overload
[guest@localhost examples]$ ./overload
func
func 1i
func 1i 2i
func 1i 2d
[guest@localhost examples]$



Отредактировано py.user.next (Март 12, 2014 01:34:58)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version