【问题标题】:How to override only one variable inside parent class's method?如何在父类的方法中只覆盖一个变量?
【发布时间】:2021-12-16 13:02:03
【问题描述】:

假设Parent 类是:

class Parent:

  def __init__(self, a):
    self.a = a

  def do_something(self):
    a = self.a
    b = self.a
    print('The a is ', a)
    print('The b is ', b)

我想创建一个 Child 类,它只重新定义 b

类似:

class Child(Parent):

  def do_something(self, custom_param):
    @some_exotic_decorator_or_something_else(b=custom_param)
    super().do_something()

并获得如下输出:

obj = Child('the_a')
obj.do_something('the_b')
The a is the_a
The b is the_b

当然原始方法有很多行和复杂的逻辑来覆盖整个方法。这也是常见的python库之一,所以我想尽量减少对方法的入侵。

在 python 中有什么常用的方法来做到这一点?

为了更清楚,我要覆盖的方法是_write_end_record

我只想重新定义centDirOffset。所有其他逻辑都运行良好。我可以将整个方法复制并粘贴到我的代码中,并且只更改一行,但这看起来不是一个聪明的主意

【问题讨论】:

  • 不是真的...函数是不透明的对象,您不能轻易地触及到修改单个变量或行或其他任何东西。 — 是的,如果向后弯腰足够多,这可能是可能的,但是对于您要解决的任何问题,这真的不应该是您的第一个 goto 解决方案。
  • 我是否正确理解你的父类不是你的,而是现有库中的东西?
  • @CrazyChucky 是的。在To be more clear之后添加了附加信息

标签: python overriding


【解决方案1】:

一种简洁而简单的方法是通过向您的方法添加一个参数并为其分配一个默认值来使您的父类更通用。

class Parent:

    def __init__(self, a):
        self.a = a

    def do_something(self, b=None):
        if b is None:
            b = self.a
        a = self.a
        print('The a is ', a)
        print('The b is ', b)

通过这样做,您甚至不需要子类。

【讨论】:

  • 好的。我添加了我想在内部问题中覆盖的确切类和方法。任何想法如何make it more general
  • @rzlvmp This thread 可能会把你带到你想要的地方,但我不认为这是一种很好的编码方式。
  • 我使用另一个strategy 解决了我的问题。但我仍在寻找如何部分覆盖现有方法的方法。之前提到的链接没有答案如何做到这一点
  • @rzlvmp 正如 deceze 所指出的,这涉及到很多事情。我的想法是导入您想要的函数并在使用正则表达式导入时对其进行修改。这样您就可以覆盖用于centDirOffset 的值。该线程提供了一些策略来实现这一点。但我不明白你为什么要这样做。你让自己依赖于导入函数的实际源代码(不仅依赖于行为)以及它未来的变化。在我看来,这是未来灾难的秘诀。而是坚持一次 CTRL-C + CTRL-V ,你会很好的很长一段时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2011-04-17
  • 1970-01-01
相关资源
最近更新 更多