7

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

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

4

2 回答 2

9

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

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

于 2012-08-22T05:03:39.033 回答
1

您需要在适当的位置运行超类的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? 
于 2012-08-22T05:05:20.697 回答