调用位于pythonlis内部的类实例的方法

2024-09-28 13:17:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中有以下几个类:

  • QueryElement作为根类
  • ElemMatch和{},它们从根继承。在

我在ElemMatch类中有一个列表,它应该有QueryElement的实例。在

我的问题是从列表中的实例调用一个名为compute的方法,该方法位于ElemMatch类(compute method)中。我不知道如何在列表中指定一个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()

Tags: 实例方法gtself列表defclassabc
1条回答
网友
1楼 · 发布于 2024-09-28 13:17:02

在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或{}的实例。由于这两种方法都有一个名为foo的方法,所以您不必每次通过循环都知道l引用的对象的类型;foo的查找将找到正确的方法。在

这通常被称为duck-typing;如果l看起来像一个duck,并且行为类似于一个duck(即,如果它有一个方法foo),那么它就是一个duck(即,我们可以调用方法foo)。在

相关问题 更多 >

    热门问题