jungo 13.07.2011 01:27

Есть вопрос!Методы классов в Python

Здравствуйте.
Есть некий набор классов - моделей таблиц (sqlalchemy).
Для примера, возьмем классы User и Post. У них есть методы User.set_posts(), и Post.set_tags(), к примеру. Эти методы абсолютно идентичны в части логики кода, но с тем различием, что внутри метода проверяется является ли переданный параметр строкой, либо объектом класса (Post и Tag, соответственно для User.set_posts() и Post.set_tags()). Таким образом единственное различие - это проверка типа:

1
if type(x) is <нужный тип>: ...



В общем, не могу понять, как бы покрасивее отрефакторить этот код так, что бы нужный код был реализован только 1 раз, а не в каждом отдельном классе с незначительным изменением.

По идее, можно реализовать отдельную функцию в модуле, которая принимает дополнительный параметр типа, и в каждом классе определить нужные функции как:
1
2
def set_posts(x):
f(x, Post)


Но по-моему, это выглядит ужасно и вообще костыль. Хочется более правильного, more pythonic, решения.
Спасибо.


Тэги: python
+ 0 -
Похожие Поделиться

derfenix 13.07.2011 17:25 #
Если я правильно тебя понял, то можно просто сделать метакласс, в котором будет метод (напр. check_type) и сделать нужные тебе классы его наследниками. если для разных классов нужны будут ещё и свои какие-то проверки, то isinstance(self, Class_Name) тебе в помощь.

т.е. примерно так будет:
1
2
3
4
def check_type(v):
  if isinstance(self, Post):
    if type(v) is string:
      bla-bla-bla

jungo 13.07.2011 20:09 #
Спасибо за ответ, я думал об этом варианте, и, скорее всего, так и решу проблему.
f_evgeny 13.07.2011 22:46 #
А нельзя наоборот? Если логика одинакова, просто преобразовать тупо на входе все в строку и все дела?