【问题标题】:How to let the constructor in the subclass inherit the constructor or base class?如何让子类中的构造函数继承构造函数或基类?
【发布时间】:2021-08-01 04:57:36
【问题描述】:

我有以下代码段,其输出如下所示

from abc import ABCMeta, abstractmethod
  
class AbstractClass(object, metaclass=ABCMeta):
    @abstractmethod
    def __init__(self, n):
        self.n = n
        print('the salary information')
 
 
class Employee(AbstractClass):
    def __init__(self, salary, name):
        self.salary = salary
        self.name = name
        super(AbstractClass,self).__init__()
 
emp1 = Employee(1000000, "Tom")
print(emp1.salary)
print(emp1.name)

我想让子类,例如Employee,也可以继承AbstractClass的构造函数中实现的功能。具体来说,我添加的print('the salary information')

super(AbstractClass,self).__init__()  # which does not work

【问题讨论】:

  • 顺便说一句,值得注意的是,在这样的子类中更改 __init__ 的签名违反了 Liskov 替换原则,因此可能不可取。很难就修复提出建议,因为尚不清楚您的 n 属性的目的是什么。 en.wikipedia.org/wiki/Liskov_substitution_principle

标签: python python-3.x abstract-class abc


【解决方案1】:

您需要将 CURRENT 类传递给super,而不是父级。所以:

        super(Employee,self).__init__()

Python 会找出调用哪个父类。

当你这样做时,它不会起作用,因为AbstractClass.__init__ 需要一个你没有提供的额外参数。

跟进

已经正确指出,这就足够了:

        super().__init__(0)

【讨论】:

  • 这里有理由不使用零参数形式吗? super().__init__('n')? (或任何n 在超级初始化中)?
  • 我不确定你在问什么。他需要向super().__init__ 提供一些论据。我们不知道争论需要什么。无论如何,我怀疑这只是一个骨架。
  • 我在问你是否真的需要将 CURRENT 类传递给 super。为什么不只是super() 而不是super(Employee,self)
  • 是的,你可以。这是 Python 3.0 中的一个变化(在此之前,您必须指定基类),我使用 super,所以我很少忘记。好点。
猜你喜欢
  • 2018-03-31
  • 2021-08-13
  • 2023-03-07
  • 2016-04-29
  • 2022-07-25
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多