Точки входа метода в переменную класса - PullRequest
0 голосов
/ 01 ноября 2011

Как можно установить в качестве переменной класса таблицу, содержащую точки входа в методы?

Для пояснения рассмотрим следующий код -working:

class A(object):

    def go(self, n):
        method = self.table[n]
        method(self)

    def add(self):
        print "add"

    def multiply(self):
        print "multiply"

    table = {
        1: add,
        2: multiply,
        }

>>> q = A()
>>> q.go(1)
add

Однако мне это не очень нравится.В начале я хотел бы иметь таблицу для удобочитаемости (реальный проект намного больше), и мне не нравится вызов, использующий method(self).Я думаю, что это очень запутанно.

У меня вопрос: есть ли лучший способ или приведенный выше код?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 01 ноября 2011

Он уже содержит один.Это называется __dict__.

class foo(object):
    def go(self, method):
        getattr(self, method)()

    def a(self):
        ...

    def b(self):
        ...

Если вы действительно хотите числовые индексы, вы можете сделать, например,

class foo(object):
    methods = { 1: 'a', 2: 'b' }
    def go(self, n):
        getattr(self, self.methods[n])()

Но это просто глупо, особенно если строки интернированы и используют магические целые числа вИх место не очень дорого, кроме безвестности.

1 голос
/ 01 ноября 2011

Я не уверен, что понимаю, почему вы хотите это сделать, но вы можете решить это по-другому, как это:

class A(object):

    table = {
        1: "add",
        2: "multiply",
        }

    def go(self, n):
        method = getattr(self, self.table[n])
        method()

    def add(self):
        print "add"

    def multiply(self):
        print "multiply"

>>> a = A()
>>> a.go(1)
add

Изменить после прочтения вашего ответа на Cat Plus Plus:

Если вы просто хотите использовать псевдонимы для существующих методов, есть гораздо более простой способ сделать это - возможно, вы захотите иметь возможность вызывать эти методы на валлийском языке:

class A(object):

    table = {
        1: "add",
        2: "multiply",
        }

    def go(self, n):
        method = getattr(self, self.table[n])
        method()

    def add(self):
        print "add"

    def multiply(self):
        print "multiply"

    ychwanegu = add
    lluosi = multiply

>>> a = A()
>>> a.lluosi()
multiply
...