用Python调用变量函数

tom*_*any 0 python call

让我们Instrument与三个功能的一类piano(self),guitar(self)trumpet(self).该类还有一个play(self)函数,它将根据类中表示的工具调用正确的方法.

有没有一种方法,只有一个类Instrument(即没有其他抽象类),来定义调用play方法时应该调用的方法?

换句话说,有没有办法做到以下几点:

my_piano = Instrument(piano)
my_piano.play() # calls piano(self) method

my_guitar = Instrument(guitar)
my_guitar.play() # calls guitar(self) method

my_trumpet = Instrument(trumpet)
my_trumpet.play() # calls trumpet(self) method
Run Code Online (Sandbox Code Playgroud)

一个相当简单的方法,但不是很干净,是在构造函数中放置一个变量,然后在play方法中放入很多条件,如下所示:

def Instrument(object):
    def __init__(self, instrument_type):
        self.instrument_type = instrument_type

    def play(self):
        if instrument_type == 0:
            self.piano()
        elif instrument_type == 1:
            self.guitar()
        elif instrument_type == 2:
            self.trumpet()
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是拥有一个Instrument类,然后是三个Piano,Guitar以及Trumpet继承自的类Instrument.但是,对于我的需要,这将使事情变得复杂.

编辑

根据要求,我解释了我的实际问题,几乎完全相同.我有一个类ComputeSth可以使用五种不同的方法来计算某些东西.它可以计算它的方式a(self),b(self),..., f(self).例如,有时我想根据a其他时间计算c.如果我这样做,这很容易:

my_computer = ComputeSth()
my_computer.a()
my_computer.c()
Run Code Online (Sandbox Code Playgroud)

但后来我注意到,为了在代码的其他部分轻松使用这个类,我更愿意这样做my_computer.compute().所以,我认为用调用时计算的实际方法构造实例会很方便compute(self).我不想写其他五个类,因为它们实际上不代表五个不同的对象,而是五种不同的方法.我无法传递函数a,...,f作为构造函数的输入,因为需要self.
换句话说,与示例相同Instrument,但具有较少的"真实世界继承".

lej*_*lot 6

这就是多态性的用途

class Instrument:

  def play(self):
    pass

class Guitar(Instrument):

  def play(self):
    print 'brau dau'

class Drum(Instrument):

  def play(self):
    print 'dum dum'


guitar = Guitar()
guitar.play()

drum = Drum()
drum.play()
Run Code Online (Sandbox Code Playgroud)