python,类重命名与继承

时间:2017-10-19 09:02:11

标签: python inheritance

如果说某些python类编写得很好,那是不正确的 那么

class Subclass(BaseClass):
    pass

应该足以创建一个表现良好的类,其行为与BaseClass相似吗?

(我写的相似但不完全相同,例如) SubClass。 name 或BaseClass。 qualname 与BaseClass中的对应物不同,这可能(可能)也扩展到 str repr 以及其他可能的元数据。

使用这样的"空"是否有意义继承进行类重命名以获得更好的语义,例如如果你想计算一些成人/儿童/婴儿会参加一些活动,你会继承馆藏吗会被称为GuestCount吗?或称之为" Polinomial"并使用计数值来表示某些类的系数,这些系数代表一些幂的变量(即X ^ 2或Y ^ 3)等等?

编辑: 我不知道我的Q如何与任何方式的动态重命名有关。 我说的是继承权。别名(或可能只是实例化),但不是动态地重命名现有的类,也不是动态创建与如何命名那些动态创建的类相关的类和问题,如下文所述的所谓重复中所述:(

3 个答案:

答案 0 :(得分:1)

虽然不常见,但我认为这确实有意义。我会把你转介给Robert Martin的this article。特别是最后一段支持你的理由。虽然本文讨论重命名函数,但相同的参数可用于重命名类。

此外,与PersonCounterPolynomial不同的概念很可能很快在功能方面也会出现分歧,尽管它们从同一个类开始,因此将它们设置为不同的类是有意义的。 / p>

注意:python框架中一个密切相关的常见模式是只有一个类属性的子类

class GuestCounter(Counter):
    datatype=Person

class Polynomial(Counter):
    datatype=float

如果您为对象创建工厂函数/类型检查器/适配器函数

,这可能很有用

答案 1 :(得分:0)

另一个优点是您可以向SubClass添加属性, 虽然它可能无法用于BaseClass(例如dict或list)。

答案 2 :(得分:0)

如果你真的得到更好的语义可能会有意义,但在你的例子中你没有。

AdultCounterChildCounter表明计算成人与计算儿童有所不同,这是虚假和误导的。不是因为他们碰巧共享相同的实现(如在其他答案中链接的Uncle Bob`s article中所解释的那样没问题),但因为它们在概念上是相同的。计算所计数项目的任何属性的摘要。计算成人,儿童,绵羊或它们的混合物,都是一样的。

adults = AdultCounter({ev: ev.num_adults() for ev in events})
children = ChildCounter({ev: ev.num_children() for ev in events})

偶然的读者会想知道这些计数器做了什么,裸Counter没有。之后,他们必须查看定义以找出答案:没有。那有什么意义呢?实际上不同的部分,过滤,是在柜台外完成的。

对于多项式,Counter看起来不是一个好的抽象。为什么mypoly.most_common()会返回系数最高的术语?为什么poly1 + poly22 * poly没有而poly1 - poly2错误的情况下有效?