虽然我知道这很奇怪,但我仍然想知道它是否可以主要用于提高理解。 基本上,它是继承一个类,而且还可以从父类中调用子类中的方法。
问题示例如下:
class Match:
player = Player(...)
# other things here
class Player:
def __init__(self, name, etc)
....
self.display = Display(self)
class Display(Player):
def __init__(self, player):
super().__init__(player.name,...)
这样做的目的是从
self.player.display.method()
调用 Match
,以帮助将 Player
的显示功能与所有其他方法分开。
目前,上面的方式会导致
Player
和 Display
之间的递归。
只需删除 Display
类并将方法扁平化为 Player
即可解决此问题。但我不想那样做。另一种选择是找到一种方法,在 super().__init__
到达 Display
之前停止 self.display
可能带有标志变量,但我没有让它工作。
在我的解决方案中我想:
Display
能够访问 Player
中的所有实例数据和方法,因此 self.name
可以在 Display
中工作,而无需调用 self.player.name
或手动分配 self.name
Player
调用 Display
中的方法
纯粹出于美观原因,有效地在两者之间创建共享类。我尝试过阅读 super() 文档和文章,例如 https://rhettinger.wordpress.com/2011/05/26/super-considered-super/
使用守卫条件,例如
if not from_super: self.display = ...
嫌疑人可能能够使用 hasattr
来检测超级调用,但没有让它发挥作用
显示器需要玩家的“90% 的变量”,并不会改变显示器不是玩家的事实。将播放器实例保留为 Display 的属性(如果有意义的话),并且如果问题是键入
self.name
而不是 self.player.name
,只需将 self.player
属性赋予显示方法开头的局部变量 - player = self.player
- 然后你就做player.name
。
除此之外,当真正使用继承时,超类调用子类中的方法的方式就是调用然后 - 将使用子类中的重写方法。人们可以为这些方法创建存根,或者创建一个抽象基类 - 或者根本不创建,只在子类中记录所需的方法。
例如,在此项目中您可以有
class UserControledPlayer(Player):
和 class BotPlayer(Player):
,每个都有不同的 def move(self, ...):
方法。