2013-09-03 2 views
2

В this article Гвидо ван Россум говорит, что такого рода Многометодная реализации в Python:Python мультиметоды с использованием isinstance

def foo(a, b): 
    if isinstance(a, int) and isinstance(b, int): 
     ...code for two ints... 
    elif isinstance(a, float) and isinstance(b, float): 
     ...code for two floats... 
    elif isinstance(a, str) and isinstance(b, str): 
     ...code for two strings... 
    else: 
     raise TypeError("unsupported argument types (%s, %s)" % (type(a), type(b))) 

является «утомительно» и «не очень OO». Затем он переходит к описанию того, как декораторы могут использоваться для реализации мультиметодов, которые, как я думаю, были бы недоступны тем, у кого не было достаточно глубокого знания Python.

Мой вопрос: мне нужно написать мультиметод, что на самом деле «не OO» о коде выше?

ОБНОВЛЕНИЕ: В свете ответа Томаса Ороско я теперь понимаю, что мне вообще не нужно «писать» многометод.

+1

Вы бы возложить ответственность за «... кода два абсолюта ...» в какой бы то ни типа. –

ответ

4

Вместо проверки типов объектов, передаваемых вашему методу, вы должны сделать так, чтобы объекты сами реализовали логику.

Давайте рассмотрим пример: len.

Уроженец реализация будет:

def len(x): 
    if type(x) == str: 
     # compute the length of a string 
    elif type(x) == list: 
     # compute the length of a list 
    else: 
     # 

Но есть несколько предостережений

  • Вы не могли поддерживать len в ваших собственных объектов без повторного внедрения len
  • Это огромный , нечитаемые, беспорядочные

И, что самое главное, OO-часть об этом, это означает, что ваша реализация str разбросана по всей вашей кодовой базе: код для вычисления ее длины здесь, код для нарезки - это где-то еще ...


Вместо этого, гораздо разумнее дизайна, что используется в Python:

def len(x): 
    return x.__len__() 

это тогда до каждого объекта реализации __len__ метода самих. Функция len просто запрашивает объект по его длине.

В определенной степени, можно считать это "Strategy Pattern"

+0

Это так очевидно, когда вы так выразились! Полагаю, поэтому он говорит, что мультиметоды сами по себе «не очень OO». –

Смежные вопросы