【问题标题】:Classes with attributes but no methods有属性但没有方法的类
【发布时间】:2019-03-11 19:00:42
【问题描述】:

我是初学者,但我正在尝试在 python 中实现棋盘游戏(奥尔良)。我为游戏状态创建了一个类,并为每个玩家创建了一个类。我曾考虑为每种类型的动作空间创建一个类,并为每个玩家创建一个动作空间的实例,因为每个玩家都有一组共同的动作空间。这些动作空间类中的每一个都有一些属性,通常在__init__() 方法中设置。但是他们没有其他方法。这是对类的一种很好的使用,还是我应该只更改代码以使用许多单独的变量?我将它们设为类的原因是为了让变量的命名更加直观。下面的代码给出了一个播放器类和两个动作空间类的示例:

class Player:

    def __init__(self, start_characters, name):
        // other attributes
        self.farmhouse = Farmhouse()
        self.village = Village()

class Farmhouse:

    def __init__(self):
        self.boatman = False
        self.craftsman = False

class Village:

    def __init__(self):
        self.farmer = False
        self.boatman = False
        self.craftsman = False

然后,游戏状态类将具有将玩家实例作为参数的函数,测试动作空间是否具有触发该动作的每个适当要求。

【问题讨论】:

    标签: python-3.x class methods


    【解决方案1】:

    这样做被称为“贫血对象”或"Anemic domain" 模型。

    有些人认为这是一种反模式,有些人则不是。我通常更喜欢贫血模型,因为它在我看来更具可读性和可扩展性。

    我强烈建议您使用dataclasses 来处理这种行为,而不是创建这样的类。

    对于不可变类型,另一种选择是使用namedtuples

    【讨论】:

      【解决方案2】:

      这有利于可读性,并且在定义基本上将相关数据组合在一起的类时没有问题。例如,您甚至可能希望这样做以减少需要传递给函数的参数数量。至于只有一个方法,如果这不是真的关于数据,我会说定义函数。这里不是这样。

      你有什么选择?也许在__init__ 中设置字典并在键中设置名称。幕后没有太大的不同。

      对于生成的访问语法,我更喜欢您的选项。

      【讨论】:

      • 谢谢。我一直在看和阅读很多关于 OOP 的东西,并且看到它说你不应该只使用一种方法来上课。例如这个。
      • 我看到了链接,谢谢。我们应该了解和遵循许多好的原则和启发式方法。但由于它们是通用的,因此请始终对您的具体案例使用常识。最后它甚至清楚地同意我的回答。他说了一些有争议甚至有趣的事情,反映在视频中。可以举出不同的例子,为一些相反的观点辩护。我将其总结为:代码越少越好,越简单越好,你不需要它,但可读性很重要。不过,不要过度设计它。但抽象将继续存在......
      • @TaxpayersMoney,请注意,通过阅读代码清楚地理解代码比代码小更重要。如果你写了很多不可读的小代码,你最终会得到一个没有人愿意维护的大的不可读的应用程序,甚至你自己也不想。
      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      相关资源
      最近更新 更多