调用位于python列表中的类实例的方法

时间:2014-08-07 18:30:29

标签: python python-2.7

我在python中有以下类:

  • QueryElement作为根类
  • ElemMatchGT从根目录继承。

我在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()

1 个答案:

答案 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的每个元素都是AB的实例。由于两者都有一个名为foo的方法,因此每次循环时都不必知道l引用的对象的类型;查找foo将找到正确的方法。

这通常被称为 duck typing ;如果l看起来像一只鸭子并且像鸭子一样(即,如果它有方法foo),那么它就是一只鸭子(即,我们可以调用方法foo

相关问题