Python:如何调用来自数组的方法?

时间:2015-11-27 09:45:34

标签: python methods switch-statement

这是我的具有常量的类:

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."))

换句话说:pcanvas.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的方法是什么?

2 个答案:

答案 0 :(得分: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 :(得分:2)

只要按键合适,你绝对可以做到这一点。函数在Python中是first class

所以:

my_functions = {"function 1": print}

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

工作正常。

我怀疑,如果你遇到问题,可能是因为无论你使用什么密钥都不可用......或者你只是没有使用正确的密钥?

编辑:关于你的编辑/评论,基于p是Canvas的一个实例,你应该能够做到:

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

基本上通过" p" in作为self参数(因为字典中的方法未绑定到实例)。