2015-11-27 5 views
2

Вот мой класс, который имеет константы:Python: как вызвать метод, исходящий из массива?

class Bubble(models.Model): 
    GAUCHE = u'0' 
    CENTRE = u'1' 
    JUSTIFIE = u'2' 
    DROITE = u'3' 

Затем в другой файл, я использую Bulle так:

drawCustom = { 
    Bubble.GAUCHE: canvas.Canvas.drawString, 
    Bubble.CENTRE: canvas.Canvas.drawCentredString, 
    Bubble.JUSTIFIE: canvas.Canvas.drawAlignedString, 
    Bubble.DROITE: canvas.Canvas.drawRightString, 
} 

И в этом файле, чуть позже, у меня есть

for bubble in mymodel.bubbles.all(): 
    # bubble is an instance of the class Bubble 
    p = canvas.Canvas(response) 
    p.drawString(100, 100, "Hello world.") 
    # I want to avoid `drawString` and use my array `drawCustom` 
    # to make something like: 
    #  p.call(drawCustom[bubble](100, 100, "Hello world.")) 

Другими словами: p является объектом canvas.Canvas, поэтому он может получить доступ ко всем функциям «drawing». Я хотел бы избежать большой if() elif() и сделать что-то вроде: p.call(drawCustom[bubble](100, 100, "Hello world."))

Вот мой код, который работает, но я считаю, это некрасиво:

for b in mymodel.bubbles.all(): 
    # b is an instance of the class Bubble 
    p = canvas.Canvas(response) 
    if b.texte_alignement == Bulle.GAUCHE: 
     p.drawString(100, 100, "Hello world.") 
    elif b.texte_alignement == Bulle.CENTRE: 
     p.drawCentredString(100, 100, "Hello world.") 
    elif b.texte_alignement == Bulle.JUSTIFIE: 
     p.drawAlignedString(100, 100, "Hello world.") 
    elif b.texte_alignement == Bulle.DROITE: 
     p.drawRightString(100, 100, "Hello world.") 

Можно ли, и если нет, то путь в Python?

+0

А что такое 'пузырь'? –

+0

bubble - это экземпляр класса Bubble –

+0

Я не вижу никакого класса 'Bubble' –

ответ

4

Это должно работать:

drawCustom[bubble](p, 100, 100, "Hello world.") 

В качестве альтернативы, если вы храните в drawCustom имена методов вместо объектов метод, вы можете сделать:

drawCustom = { 
    Bubble.GAUCHE: 'drawString', 
    Bubble.CENTRE: 'drawCentredString', 
    Bubble.JUSTIFIE: 'drawAlignedString', 
    Bubble.DROITE: 'drawRightString', 
} 
func = getattr(p, drawCustom[bubble]) 
func(100, 100, "Hello world.") 
+1

Спасибо, действительно, решение №1 - это путь. –

+0

@OlivierPons, прохладно. Обратите внимание, что решение # 1 работает только в том случае, если существует только один класс Canvas. Если наследование задействовано, решение № 2 является более надежным (будет вызываться правильное определение метода) – shx2

2

Пока ключи правильно, вам может определенно сделать это. Функции first class в Python

Итак:

my_functions = {"function 1": print} 

my_functions["function 1"]("Hello, world") 

работает просто отлично.

Я подозреваю, что если у вас есть вопросы, это может быть вплоть до того, что все, что вы используете для ключей не hashable ... или вы просто не используете правильный ключ? ..

EDIT: что касается вашего редактирования/комментарий на основании того, что р является экземпляром Canvas, вы должны просто быть в состоянии сделать:

drawCustom[bubble](p, 100, 100, "Hello world.") 

по сути прохождения «р» в качестве self аргумента (как методы в вашей словарь не привязаны к экземпляру).

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