python - 继承:更改子方法的签名

标签 python oop inheritance overriding

当存在更改子项中的方法签名的“坏主意”时,我试图弄清楚 Python 继承原则中的最佳实践是什么。

假设我们有一些基类 BaseClient 已经实现了 create 方法(和一些抽象方法),它适用于几乎所有“后代”,除了一个:

 class BaseClient(object):

     def __init__(self, connection=None):
         pass

     def create(self, entity_id, data=None):
         pass

 class ClientA(BaseClient):
     pass

 class ClientB(BaseClient):
     pass

唯一的类 ClientC 需要另一个 create 方法的实现,带有一点点另一个方法签名

 class ClientC(BaseClient):
     ....
     def create(self, data):
         pass

所以问题是如何以更“pythonic”的方式制作它,同时考虑到最佳 python 实践?当然,我们可以在父(子)方法中使用 *args、**kwargs 和其他类似 **kwargs 的方法,但恐怕这会使我的代码变少可读( self 记录)。

最佳答案

我想说的是,只需将参数添加回默认值 None 的关键字即可。然后引发错误,解释部分输入数据丢失。

 class ClientC(BaseClient):
 ....
     def create(self,entity_id=None, data):
         if entity_id:
             raise RedudantInformationError("Value for entity_id does nothing")
         pass

这样,每当程序员试图像处理其他 child 一样处理 child C 时,他都会收到警告提醒他,但是他可以使用 try-Syntax 轻松地逐步进行。

关于python - 继承:更改子方法的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45523156/

相关文章:

C++11 构造函数继承不起作用

c# - 继承一个没有任何构造函数的抽象类

Python - 类型对象 'str' 没有属性 'string'

python - RegExp 匹配重复的字符

c# - 当不能选择多重继承时如何重用代码?

c++ - C++ 中的类和封装 (OOP)

python - 散点图中的轴范围

python - AWS Glue - 在插入之前截断目标 postgres 表

ios - Swift 中类型的静态属性

ios - 面向对象 - 父类(super class)中的 iOS isEqual 方法,它对子类是否正常工作?