Python中的并行子类?在子类中使用子类

时间:2013-10-21 18:01:25

标签: python class subclass superclass

我正在尝试使我的程序可扩展。这是一款可以玩多种游戏的通用纸牌游戏。

我有一个通用服务器,我们称之为类GenericServer。它会导入CardsPlayersContainers等类

我还有一个特定于游戏的服务器类,它是GenericServer的子类,让我们称之为MagicServer

我想要做的是MagicServer导入的GenericServer加载游戏特定版本的类。

class GenericServer(object):
    # imports Cards(object), Players(object), Containers(object)

class MagicServer(GenericServer):
    # imports MagicCards(Cards), MagicPlayers(Players), MagicContainers(Containers)

计划是将多个游戏特定服务器作为GenericServer的子类,但也有自己的CardsPlayersContainers等版本。我已经考虑只是单独打破服务器,但由于他们共享了大量相同的代码,我想从GenericServer继承它们。

有关如何解决此问题的任何建议?

2 个答案:

答案 0 :(得分:0)

您不需要将所有内容子类化,为什么不只是将通用服务器子类化,然后在魔术服务器中拥有您需要的其他类的实例。

例如:

class MagicServer(GenericServer):
    def __init__(self):
        self.cards   = Cards()
        self.players = Players()
        self.containers = Containers()

通过这种方式,您的魔术服务器类可以使用唯一的卡片实例。

答案 1 :(得分:0)

是服务器生成卡片,玩家等,还是只是服务/使用它们? 如果第一个...那么服务器类不需要知道使用什么类型的卡,播放器等。其他东西将创建它并将其传递给服务器,服务器将使用标准卡(例如)API来使用它。这可能更容易维护和构建。

但是,如果第二个......那么你可以用类变量来做:

class Cards(object):
    pass

class MagicCards(Cards):
    pass

class GenericServer(object):
    cards = Cards

    def createCards(self):
        return self.cards()

class MagicServer(GenericServer):
    cards = MagicCards

gs = GenericServer()
ms = MagicServer()

gs.createCards()
<__main__.Cards at 0x3df6048>
ms.createCards()
<__main__.MagicCards at 0x3df6080>

这些不必是类变量 - 它们也可以传递给init函数。

class GenericServer2(object):
    def __init__(self, cards):
        self.cards = cards

    def createCards(self):
        return self.cards()

gs2 = GenericServer2(Cards)
ms2 = GenericServer2(MagicCards)
gs2.createCards()
<__main__.Cards at 0x3ee5a58>
ms2.createCards()
<__main__.MagicCards at 0x3ee5470>

使用哪一个?这真的没那么重要。如果您实际上是GenericServer的子类,那么第一个可能更直接。如果您只是使用子类来轻松区分类,则第二种更容易,您可以使用工厂函数模拟以前的行为:

def MagicServer2():
    return GenericServer2(MagicCards)