【问题标题】:Parallel Subclassing in Python? Using Subclasses in a SubclassPython中的并行子类化?在子类中使用子类
【发布时间】:2013-10-21 18:01:25
【问题描述】:

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

我有一个通用服务器,我们称之为类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 继承它们。

关于如何解决这个问题的任何建议?

【问题讨论】:

  • 你能澄清你的问题吗?你已经很好地描述了你的设置,但我对你试图解决的问题的确切性质有点不确定。您是否试图减少代码重复?自动让MagicCardsMagicPlayers等自动继承相应的子类?还有什么?
  • @Michael0x2a 在我看来OP想保证FooServer只能使用FooCards、FooPlayers、FooContainers等,同时保证BarServer只能使用BarCards、BarPlayers、BarContainers,等等
  • @EduardoLeón 是的,这就是我想要做的。

标签: python class subclass superclass


【解决方案1】:

服务器是生成卡片、玩家等还是只是服务/使用它们? 如果是第一个……那么服务器类不需要知道使用了什么样的卡、玩家等。其他东西会创建它并将其传递给服务器,服务器将使用标准 Card(例如)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)

等等

【讨论】:

    【解决方案2】:

    你不需要子类化所有东西,为什么不只是子类化通用服务器,然后在魔法服务器中拥有你需要的其他类的实例。

    例如:

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

    这样,您的魔法服务器类就有一个唯一的 Cards 实例可供使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2015-08-28
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      相关资源
      最近更新 更多