如何在完全不相关的类中调用类的父方法?

时间:2014-08-04 12:15:10

标签: python python-3.x superclass super

我想使用超类来调用类的父方法,同时使用不同的类。

Class AI():
...

 for i in self.initial_computer_group:
             if i.rect.x == current_coords[0] and i.rect. y== current_coords[1]:
                 i.move(coords_to_move[0], coords_to_move[1])
当我想要父类的原始方法时,

i.move()会从继承的类调用方法。

self.initial_computer_group包含一个与AI类完全无关的对象列表。

我知道我需要以某种方式获取我引用的当前对象的类名,但后来我不知道在super()中使用什么作为第二个参数,因为我不能使用self,因为它与人工智能无关。

那么,如果我在一个完全不同的类别中使用super(),我将如何使用super()

注意:我想调用父方法,因为它会加速一切。我只设计了继承的方法,以确保人类不会违反本次国际象棋游戏中的规则。

编辑:我通过将继承方法的名称更改为其他内容找到了解决方案,但我想知道是否还有一种特殊方式可以调用{{1}}解决问题

3 个答案:

答案 0 :(得分:3)

听起来你想要调用特定类的方法,无论继承图是什么样的(特别是,即使该方法恰好被重写两次)。在这种情况下,您不希望super。相反,直接调用类的方法。例如,假设您想要的版本位于Foo类:

Foo.move(i, coords_to_move[0], coords_to_move[1])

答案 1 :(得分:0)

由于在评论中难以阅读代码,这里有一个简单的例子:

class BaseClass():
    def func(self):
        print("Here in BaseClass.")


class InheritedClass(BaseClass):
    def func(self):
        print("Here in InheritedClass.")


def func(instance):
    super(InheritedClass, instance).func()

使用中:

>>> func(InheritedClass())
Here in BaseClass.

但这显然会使您的代码变得不那么灵活(因为instance参数必须是InheritedClass实例),并且通常应该避免使用。

答案 2 :(得分:0)

给定一些继承层次结构:

class Super:                 # descends from object 
    def func():
        return 'Super calling'

class Base(Super):
    def func():
        return 'Base calling'

class Sub(Base):
    def func():
        return 'Sub calling'        

您可以使用__mro__属性获取resolution hierarchy

>>> s=Sub()
>>> s.__class__.__mro__
(<class '__main__.Sub'>, <class '__main__.Base'>, <class '__main__.Super'>, <class 'object'>)

然后你可以通过索引选择那些:

>>> s.__class__.__mro__[-2]
<class '__main__.Super'>
>>> s.__class__.__mro__[-2].func()
Super calling

您可以通过匹配__name__属性来获取特定名称:

def by_name(inst, tgt):
    for i, c in enumerate(inst.__class__.__mro__):
        if c.__name__==tgt:
            return i

    return -1    

然后,如果要调用不相关类的父类,只需使用感兴趣的方法在子类的实例上使用这些方法之一。

当然最简单的答案是如果你知道你想要的类和方法,只需直接调用它:

>>> Super.func()
Super calling
>>> Base.func()  
Base calling  

如果您需要向上几级(或未知数量的级别)来查找该方法,Python将为您执行此操作:

class Super:
    def func():
        return 'Super calling'

class Base(Super):
    pass

class Sub(Base):
    pass    

>>> Sub.func()
Super calling