【问题标题】:Subclass not inheriting parent class子类不继承父类
【发布时间】:2012-08-22 05:00:14
【问题描述】:

我的代码有问题。我正在尝试创建一个继承父类的属性和方法的子类,但它不起作用。这是我到目前为止所拥有的:

class Employee(object): 
  def __init__(self, emp, name, seat):
    self.emp = emp
    self.name = name
    self.seat = seat

下面的代码块有问题 - 子类。

我必须再次创建__init__ 吗?以及如何为子类创建新属性。从阅读问题来看,听起来子类中的__init__ 将覆盖父类 - 如果我调用它来定义另一个属性,这是真的吗?

class Manager(Employee): 
  def __init__(self, reports):
    self.reports = reports
    reports = [] 
    reports.append(self.name) #getting an error that name isn't an attribute. Why? 

  def totalreports(self):
    return reports

我希望 Employee 类中的名称出现在报告列表中。

例如,如果我有:

emp_1 = Employee('345', 'Big Bird', '22 A')
emp_2 = Employee('234', 'Bert Ernie', '21 B')

mgr_3 = Manager('212', 'Count Dracula', '10 C')

print mgr_3.totalreports()

我想要reports = ['Big Bird', 'Bert Ernie'],但它不起作用

【问题讨论】:

标签: python inheritance attributes parent-child


【解决方案1】:

您从未调用过父类的 __init__ 函数,这是定义这些属性的地方:

class Manager(Employee): 
  def __init__(self, reports):
    super(Manager, self).__init__()
    self.reports = reports

为此,您必须修改Employee 类的__init__ 函数并为参数提供默认值:

class Employee(object): 
  def __init__(self, emp=None, name=None, seat=None):
    self.emp = emp
    self.name = name
    self.seat = seat

另外,这段代码根本不起作用:

  def totalreports(self):
    return reports

reports 的作用域只在__init__ 函数内,所以它是未定义的。您必须使用self.reports 而不是reports

至于你的最后一个问题,你的结构不会真正让你很好地做到这一点。我会创建第三个类来处理员工和经理:

class Business(object):
  def __init__(self, name):
    self.name = name
    self.employees = []
    self.managers = []

  def employee_names(self);
    return [employee.name for employee in self.employees]

您必须通过将员工附加到适当的列表对象来将员工添加到业务中。

【讨论】:

    【解决方案2】:

    您需要在适当的位置运行超类的 init(),并捕获(子类未知的)参数并将它们传递:

    class Manager(Employee): 
      def __init__(self, reports, *args, **kwargs):
        self.reports = reports
        reports = [] 
        super(Manager, self).__init__(*args, **kwargs)
        reports.append(self.name) #getting an error that name isn't an attribute. Why? 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2012-04-11
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多