子类不继承父类

时间:2012-08-22 05:00:15

标签: python inheritance attributes parent-child

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

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'],但它不起作用

2 个答案:

答案 0 :(得分:8)

您从未调用父类的__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]

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

答案 1 :(得分:0)

您需要在适当的位置运行超类的 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?