Форум сайта python.su
0
Всем доброго дня. Есть такая задача:
Есть класс с методом foo. Метод получает один параметр и на его основе вызывает другой метод. Например, если параметр - 1, вызвать bar(), если 2 - baz() и т. д.
В теории, создается очень много объектов этого класса, поэтому вставлять маппинг {1: bar, 2: baz} в __init__ довольно накладно. Я хочу сделать этот словарь аттрибутом класса, но не знаю как. Либо же есть другой, более грамотный вариант?
Офлайн
568
dnoxЭто ерунда какая-то. Но если хочется извращений, то можно
В теории, создается очень много объектов этого класса, поэтому вставлять маппинг {1: bar, 2: baz} в __init__ довольно накладно.
class SuperClass(object): def bar(self): return 1 def baz(self): return 2 DCT={1:bar,2:baz} def foo(self, param): return self.DCT[param](self) s = SuperClass() print s.foo(1) print s.foo(2)
Офлайн
0
FishHookНу, задача скорее теоретическая, чем практическая. Понятно, что для того чтобы забить память придется создать ОЧЕНЬ много объектов. Вопрос можно было бы переформулировать так: как правильно хранить константу класса, которая одинакова для всех объектов класса.
Это ерунда какая-то.
Офлайн
88
dnoxКак её правильно хранить показал FishHook, но для описанного выше случая ничего создавать не нужно - всё есть готовое.
как правильно хранить константу класса, которая одинакова для всех объектов класса
Офлайн
0
ShamanМожешь пояснить? Через __getattribute__?
но для описанного выше случая ничего создавать не нужно - всё есть готовое.
Офлайн
88
dnoxЭто частности, главное что есть __dict__ . Посмотрите внутренности inspect.
Через __getattribute__?
Офлайн
0
ShamanНу, __dict__ я отбросил по другим причинам. Если делать через __dict__, придется каждый раз перед вызовом функции проверять ее наличие в __dict__, в моем же варианте проверка пройдет один раз при запуске.
Это частности, главное что есть __dict__ . Посмотрите внутренности inspect.
Офлайн
88
На самом деле проверка будет производиться каждый раз, явная, или неявная.
Офлайн