python - 成分 : Should I access the "inner object' s"methods directly?

标签 python oop

我对 OOP 还比较陌生,而且肯定还在学习中。我想知道处理这样的两个类时的最佳实践是什么:

(我对一个旧电脑游戏的统计引擎进行了逆向工程,但我想这个主题对我的问题并不重要)

class Step(object):
    def __init__(self):
        self.input = 'G'

    ...more attributes...

    def reset_input(self):
        ''' Reset input to None. '''
        self.input = None
        print '* Input reset.'

        ... more methods ...

然后我有 Player 类,它是要控制的主要对象(至少在我的设计中):

class Player(object):
    ''' Represents a player. Accepts initial stats.'''
    def __init__(self, step= 250, off= 13, dng= 50000, dist= 128, d_inc= 113):
        self.route = []
        self.step = Step(step=step, off=off, dng=dng, dist=dist, d_inc=d_inc)
        self.original = copy.copy(self.step)

如您所见,Player 包含一个 Step 对象,它代表下一个 Step。

我发现有时想要访问该 Step 类中的方法。 既然如此,是不是给Player添加一个包装器比较好,比如:

(如果我想访问reset_input()):

class Player(object):
    ...
    def reset_input(self):
        self.step.reset_input()

然后让Player重置输入值:

p = Player()
p.reset_input()

或者直接使用以下命令访问 reset_input() 会是更好的做法:

p = Player()
p.step.reset_input()

看来添加包装器只是复制代码。这也很烦人,因为我需要访问 Step 的很多方法。

那么,当使用组合时(我认为这是正确的术语),直接访问“内部”对象方法是一个好的做法吗?

最佳答案

我认为如果出现以下情况,您应该在 OOP 中应用额外的抽象层:

  1. 您预计自己稍后会更新代码;和
  2. 该代码将在多个地方使用。

在这种情况下,假设您采用此方法:

def reset_input(self):
    self.step.reset_input()

然后您可以在代码中的多个位置调用它。稍后,您决定在对 reset_input 的所有调用之前执行操作 x(),将可选参数 y 传递给 reset_input,然后执行操作z()。然后更新方法就很简单了,如下所示:

def reset_input(self):
    self.x()
    self.step.reset_input(self.y)
    self.z()

只需按几下按键,代码就会随处更改。想象一下,如果您因为没有使用包装函数而必须更新多个位置的所有调用,那么您将面临一场噩梦。

如果您确实预见到自己使用包装器来对代码进行更改,则应该应用包装器。这将使您的代码更易于维护。正如评论中所述,这个概念被称为封装;它允许您使用隐藏实现细节的接口(interface),以便您可以随时轻松更新实现,并且它将以非常简单的方式普遍更改代码。

关于python - 成分 : Should I access the "inner object' s"methods directly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29231412/

相关文章:

python - 如何测量生成器序列的长度(list comp vs generator expression)

python - 更新失败,错误代码为 BUILD_DOCKER_UNKNOWN

c++ - 如何在 C++ 中为 PacMan 编写 map

JavaScript 继承与工作代码助手和大纲?

Python,带有函数调用的 if else 语句的简洁代码?

python - POST 到 google apis 计算引擎给出 400

python - 在 Python 中导入模块作为包的一部分*以及*以独立工作的方式

python - Python 中的元类是什么?

java - 如何访问接口(interface)内的抽象类

java - 强制转换 "type-erased"对象安全吗?