gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:44:40 25 4
gpt4 key购买 nike

我对 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 类中的方法。这种情况下,是不是给Player加一个wrapper比较好,比如:

(如果我想访问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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com