让我们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,但具有较少的"真实世界继承".
这就是多态性的用途
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)
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |