我在python中有以下类:
QueryElement
作为根类ElemMatch
和GT
从根目录继承。我在ElemMatch
类中有一个列表,该列表应该包含QueryElement
的实例。
我的问题是在compute
类(计算方法)中从列表中的实例调用名为ElemMatch
的方法。列表中的对象类型不是由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()
答案 0 :(得分: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
将找到正确的方法。
这通常被称为 duck typing ;如果l
看起来像一只鸭子并且像鸭子一样(即,如果它有方法foo
),那么它就是一只鸭子(即,我们可以调用方法foo
)