处理冗余函数参数的正确方法

2024-07-03 08:07:39 发布

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

假设下面的类层次结构包含一个基类和一些继承自该基类的常规case类:

class BaseClass:
    def f(self, a, b):
        #do something
        pass

class GeneralCase(BaseClass):
    def f(self, a, b):
        BaseClass.f(self, a, b)
        #do something else

现在,假设我们有一个特殊情况,其中函数f的一个参数是预先确定的常量。一 实现方法是从参数列表中删除此参数,如下所示:

^{pr2}$

干净的,专业的

缺点:当使用不同类的对象时,不同的方法签名可能会导致问题

选项2:设置默认值并断言它不更改

^{3}$

专业人士:相同的签名

缺点:混淆接口:“为什么我们有参数b?如果我改变了怎么办?”在

你会选择什么方法?为什么?在


Tags: 方法self参数层次结构defpass基类do
2条回答

怎么样:

class SpecialCase2(GeneralCase):
    def f(self, a, b):
        GeneralCase.f(self, a, PREDEFINED_VALUE)

这样,特殊情况2根本不使用b,并且接口保持不变。在

它根本不应该是一个亚型(参照Liskov替代原理)。在

有一个GeneralCase的属性,即:

There's a method f with two parameters ... which does yadda yadda yadda

此属性应适用于GeneralCase的所有子类型(也可以是duck类型的,无论类关系如何,都应该像GeneralCase一样嘎嘎叫的任何子类型)。如果它不成立,所有处理这些对象的代码都必须知道它以及它周围的代码。这是一个不可接受的负担,而且基本上是不必要的。在

如果这个属性对于某些特殊情况不是真的,那么这个特殊情况就不应该是子类型。它可能是高度相关的,但要么你需要一个更一般的GeneralCase,要么它不是{}的特例。在

如果您希望代码重用,请使用mixin。如果我们不需要在{cdg}上定义更多的

相关问题 更多 >