Python 是否有这样的设计模式:对某些类隐藏某些方法

Python 是否有这样的设计模式:对某些类隐藏某些方法,python,design-patterns,oop,Python,Design Patterns,Oop,我正在用Python编写一个骰子游戏的模拟,并试图找到以面向对象的方式处理以下情况的最佳方法 我有一个骰子类,处理掷骰子和报告有关骰子的事情。该类的方法包括修改骰子值的roll()方法,以及描述骰子状态的各种报告方法,如have\u of a\u kind(),is\u scoring\u composition(),和get\u roll\u value() 有两个类使用这个骰子类。玩家直接由人控制,不受信任,总是做出合法的举动。还有一个回合类,它强制执行游戏规则 因此,Player和Turn

我正在用Python编写一个骰子游戏的模拟,并试图找到以面向对象的方式处理以下情况的最佳方法

我有一个骰子类,处理掷骰子和报告有关骰子的事情。该类的方法包括修改骰子值的
roll()
方法,以及描述骰子状态的各种报告方法,如
have\u of a\u kind()
is\u scoring\u composition()
,和
get\u roll\u value()

有两个类使用这个骰子类。玩家直接由人控制,不受信任,总是做出合法的举动。还有一个回合类,它强制执行游戏规则

因此,Player和Turn类都需要能够通过调用state description方法来询问骰子的值,但是不能允许Player直接调用
roll()
方法,因为人类玩家可能在不应该滚动的时候滚动


对于我来说,有没有一个好方法允许Turn类调用骰子对象的
roll()
方法,但不允许玩家这样做?

玩家通过调用例如
Turn.roll\u Dice()
来请求
Turn
滚动。然后,
回合
可以决定是
掷骰子
还是提高
NotYourTurnError

你不能阻止
玩家
类直接调用
骰子掷骰()
,尽管你可以通过重命名
使
掷骰子
私有。但是,由于我假设玩家通过某种(G?)UI控制
骰子
,因此您不能在所述界面中包含任何告诉
骰子
滚动
的方式


一般来说,您不能以任何程度的安全性对任意Python代码隐藏这样的方法;Python是如此强大,您几乎肯定能够找到绕过保护的方法。相反,你将它们设置为受保护(
\u-foo
)或私有(
\u-foo
),并假设打电话的人知道他们在做什么。

单下划线和双下划线并不像这篇文章所建议的那样直接对应于其他语言中的
受保护的
私有的
可访问性修饰符。pythonic的做法是考虑使用单下划线(
\u foo
)来表示~privateness~,但请注意,使用双下划线(即使它有一些名称混乱),Python不会以任何方式强制执行privateness(如正确所述),因此,一般建议不要使用
\uuuuufoo
。克里斯托弗在这里完全正确。不言而喻的是,只要您尝试用python进行任何反射式编程,就会被双下划线名称的混乱所困扰。如果这对你来说没有任何意义,不要担心,但不要使用。