调用位于Python列表中的类实例的方法
我在Python中有以下几个类:
QueryElement
是根类ElemMatch
和GT
这两个类是从根类继承而来的。
在 ElemMatch
类中,我有一个列表,这个列表应该包含 QueryElement
类的实例。
我遇到的问题是,想要在 ElemMatch
类中调用列表里实例的一个叫 compute
的方法时,Python无法识别列表中对象的类型。我不知道该如何给这个列表指定一个类型。在Java中我没有这个问题,因为我可以“转换”成我想要的类型,但在这里我不知道该怎么解决。
如果你能帮忙,我会很感激。
class QueryElement(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def addQueryElement(self, queryElement):
raise NotImplementedError( "Should have implemented this" )
@abc.abstractmethod
def compute(self):
raise NotImplementedError( "Should have implemented this" )
class ElemMatch(QueryElement):
def __init__(self):
self._queryElements = []
def addQueryElement(self, queryElement):
self._queryElements.append(queryElement)
def compute(self):
elemMatch = {}
if len (self._queryElements) > 0:
elemMatch['e'] = self._queryElements[0].compute()
return elemMatch
class GT(QueryElement):
def __init__(self):
print 'someThing'
def addQueryElement(self, queryElement):
return None
def compute(self):
print 'compute GT!'
class PALLAS(object):
def foo(self):
gt = GT()
elemMatch = ElemMatch()
elemMatch.addQueryElement(gt)
elemMatch.compute()
p = PALLAS()
p.foo()
1 个回答
1
在Python中,重要的是对象本身,而不是指向这些对象的名字。只要这个对象有一个叫做compute
的方法,你就可以调用它,不管这个对象是什么类型。
举个简单的例子:
class A(object):
def foo(self):
print "I'm an A"
class B(object):
def foo(self):
print "I'm a B"
lst = [A(), A(), B(), A(), B()]
for l in lst:
l.foo()
列表lst
中的每个元素要么是A
类的实例,要么是B
类的实例。因为这两个类都有一个叫foo
的方法,所以在循环中你不需要每次都去确认l
的类型;查找foo
时会自动找到正确的方法。
这个概念通常被称为鸭子类型; 如果l
看起来像只鸭子,行为也像只鸭子(也就是说,它有一个foo
的方法),那么它就是一只鸭子(也就是说,我们可以调用foo
这个方法)。