共享类继承

问题描述 投票:0回答:1

虽然我知道这很奇怪,但我仍然想知道它是否可以主要用于提高理解。 基本上,它是继承一个类,而且还可以从父类中调用子类中的方法。

问题示例如下:


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
可能带有标志变量,但我没有让它工作。

在我的解决方案中我想:

  1. Display
    能够访问
    Player
    中的所有实例数据和方法,因此
    self.name
    可以在
    Display
    中工作,而无需调用
    self.player.name
    或手动分配
    self.name
  2. Player
    调用
    Display
    中的方法 纯粹出于美观原因,有效地在两者之间创建共享类。

我尝试过阅读 super() 文档和文章,例如 https://rhettinger.wordpress.com/2011/05/26/super-considered-super/

使用守卫条件,例如

if not from_super: self.display = ...
嫌疑人可能能够使用
hasattr
来检测超级调用,但没有让它发挥作用

python oop inheritance method-resolution-order
1个回答
0
投票

显示器需要玩家的“90% 的变量”,并不会改变显示器不是玩家的事实。将播放器实例保留为 Display 的属性(如果有意义的话),并且如果问题是键入

self.name
而不是
self.player.name
,只需将
self.player
属性赋予显示方法开头的局部变量 -
player = self.player
- 然后你就做
player.name

除此之外,当真正使用继承时,超类调用子类中的方法的方式就是调用然后 - 将使用子类中的重写方法。人们可以为这些方法创建存根,或者创建一个抽象基类 - 或者根本不创建,只在子类中记录所需的方法。

例如,在此项目中您可以有

class UserControledPlayer(Player):
class BotPlayer(Player):
,每个都有不同的
def move(self, ...):
方法。

© www.soinside.com 2019 - 2024. All rights reserved.