这是一种最佳实践问题。在
我有一个定义了一些方法的类结构。在某些情况下,我希望重写方法的特定部分。首先考虑的是将我的方法拆分成更多的原子块,然后覆盖下面的相关部分。在
class myTest(object):
def __init__(self):
pass
def myfunc(self):
self._do_atomic_job()
...
...
def _do_atomic_job(self):
print "Hello"
这是解决问题的一种看起来很实际的方法。但是由于我有太多的参数需要传输到_do_atomic_job()
并从中进行修改,所以我不想传递和检索大量的参数。另一个选择是使用self.param_var
等将这些参数设置为类变量,但这些参数在代码的一小部分中使用,使用self
不是解决这个问题的首选方法。在
我认为最后一个选择是使用内部函数。(我知道我会在可变范围内遇到问题,但正如我所说,这是一个最佳实践,忽略它们,并认为范围和所有有关内部函数的事情都按预期工作)
^{pr2}$让我们假设它如预期的那样工作。我要做的是重写内部函数_do_atomic_job()
class MyTest3(MyTest2):
def __init__(self):
super(MyTest3, self).__init__()
self.myfunc._do_atomic_job = self._alt_do_atomic_job # Of course this do not work!
def _alt_do_atomic_job(self):
mytext = "Hollla!"
我想实现的是重写继承类的内部函数_do_atomic_job
有可能吗?在
要么将
_do_atomic_job()
分解成一个适当的方法,要么分解它 进入自己的班级似乎是最好的办法。覆盖内部 函数无法工作,因为您无法访问 包含方法。在你说
_do_atomic_job()
接受了很多参数,返回了很多值。也许您可以将这些参数中的一些组合成合理的对象:如果您不能这样做,并且} 代替类的示例:
^{pr2}$_do_atomic_job()
是相当自包含的, 您可以创建助手类AtomicJobParams
和AtomicJobResult
。 使用^{最后,如果原子作业是自包含的,您甚至可以将它考虑到 自己的类
AtomicJob
。在总的来说,这更像是一个代码分解问题。力求精瘦 在适当的情况下将工作委托给助手的类。跟随single responsibility principle。如果值属于一起,则将它们打包在一个值类中。在
作为David Miller(著名的Linux内核开发人员)recently said:
内部变量与定义它们的位置有关,而不是它们在哪里执行。这上面印着“你好”。在
所以我看不出有什么方法可以在不传递局部变量的情况下使用它们,这可能是最好的方法。在
注意:传递
locals()
将得到变量的dict,但这被认为是非常糟糕的样式。在相关问题 更多 >
编程相关推荐