2010-10-05 95 views
0

我正在Python中编写一个模拟骰子游戏的模拟,并试图找到以面向对象的方式处理以下情况的最佳方法。是否有这样的设计模式:隐藏某些类的某些方法

我有一个Dice类来处理掷骰子和报告有关骰子的事情。此类的方法包括修改骰子值的roll()方法以及描述骰子状态的各种报告方法,例如have_n_of_a_kind(),is_scoring_combination()get_roll_value()

有两个类使用这个Dice类。玩家由人直接控制,不可信任始终采取合法行动。还有一个Turn类强制游戏规则。

因此,玩家和转动类都需要能够通过调用描述方法的状态向骰子询问其值,但不允许玩家直接调用roll()方法,因为人类玩家可能会滚动当它不应该。

有没有一种方法可以让Turn类调用Dice对象的roll()方法,但不允许玩家这样做?

回答

1

PlayerTurn通过呼叫turn.roll_dice()Turn然后可以决定是否roll骰子或例如提高NotYourTurnError

你不能阻止Player类直接调用die.roll(),虽然你可以通过重命名__roll使roll私有。但是,由于我假设玩家通过某种(G?)UI控制die,因此您可以简单地不包含任何在所述界面中告知dieroll的方式。

一般来说,您不能从任意Python代码中以任何程度的安全性隐藏这样的方法; Python非常强大,几乎可以肯定能够找到解决方法。相反,你可以保护他们(_foo)或私人(__foo),并假定给他们打电话的人知道他们在做什么。

+3

单引号和双引号不直接对应于其他语言中的'protected'和'private'辅助修饰符,因为这篇文章似乎暗示了这一点。 pythonic要做的事情是考虑使用单独的下划线('_foo')来表示*〜私有性〜但是请注意,使用双重下划线(即使它的名字有些混乱),Python不会以任何方式强制隐私),所以通常不建议使用'__foo'。 – ChristopheD 2010-10-05 21:58:44

+0

ChristopheD在这里完全正确。这是不言而喻的,只要你尝试在python中进行任何反射编程,你就会被双下划线名称修改烧毁。如果这对你没有任何意义,不要担心,但不要使用__foo。 – 2010-10-05 22:08:51