我想使用超类来调用类的父方法,同时使用不同的类。
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}}解决问题
答案 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