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

0 投票
1 回答
3248 浏览
提问于 2025-04-18 16:26

我在Python中有以下几个类:

  • QueryElement 是根类
  • ElemMatchGT 这两个类是从根类继承而来的。

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这个方法)。

撰写回答