重写python中方法的内部函数

2024-10-03 06:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一种最佳实践问题。在

我有一个定义了一些方法的类结构。在某些情况下,我希望重写方法的特定部分。首先考虑的是将我的方法拆分成更多的原子块,然后覆盖下面的相关部分。在

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

有可能吗?在


Tags: 方法函数self参数定义initdefjob
2条回答

要么将_do_atomic_job()分解成一个适当的方法,要么分解它 进入自己的班级似乎是最好的办法。覆盖内部 函数无法工作,因为您无法访问 包含方法。在

你说_do_atomic_job()接受了很多参数,返回了很多值。也许您可以将这些参数中的一些组合成合理的对象:

_do_atomic_job(start_x, start_y, end_x, end_y) # Separate coordinates
_do_atomic_job(start, end)                     # Better: start/end points
_do_atomic_job(rect)                           # Even better: rectangle

如果您不能这样做,并且_do_atomic_job()是相当自包含的, 您可以创建助手类AtomicJobParamsAtomicJobResult。 使用^{}代替类的示例:

^{pr2}$

最后,如果原子作业是自包含的,您甚至可以将它考虑到 自己的类AtomicJob。在

class AtomicJob:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self._do_atomic_job()

    def _do_atomic_job(self):
        ...
        self.result_1 = 42
        self.result_2 = 23
        self.result_3 = 443

总的来说,这更像是一个代码分解问题。力求精瘦 在适当的情况下将工作委托给助手的类。跟随single responsibility principle。如果值属于一起,则将它们打包在一个值类中。在

作为David Miller(著名的Linux内核开发人员)recently said

If you write interfaces with more than 4 or 5 function arguments, it's possible that you and I cannot be friends.

内部变量与定义它们的位置有关,而不是它们在哪里执行。这上面印着“你好”。在

class MyTest2(object):
    def __init__(self):
        localvariable = "hello"
        def do_atomic_job():
            print localvariable
        self.do_atomic_job = do_atomic_job

    def myfunc(self):
        localvariable = "hollla!"
        self.do_atomic_job()


MyTest2().myfunc()

所以我看不出有什么方法可以在不传递局部变量的情况下使用它们,这可能是最好的方法。在

注意:传递locals()将得到变量的dict,但这被认为是非常糟糕的样式。在

相关问题 更多 >