从另一个子类调用子类的方法的正确方法

时间:2018-07-06 22:08:32

标签: python

我正在努力了解Python,目前正在研究Employee程序。该程序相当简单,但是我遇到了麻烦。我试图从子类中调用其他子类的方法之一。它们都是从同一个类继承的,但是我不确定语法是什么。我以为可以在不发布所有代码的情况下演示自己的尝试。因此,这是我程序的简化版本:

class Employee:
  num_of_emps = 0
  raise_amount = 1

  def __init__(self, first, last, id, pay):
    self.first = first
    self.last = last
    self.id = id
    self.pay = pay


class Manager(Employee):
  raise_amount = 1.08

  def __init__(self, first, last, id, pay, emp_under_sup = None):
    super().__init__(first, last, id, pay)
    if emp_under_sup is None:
      self.emp_under_sup = []
    else:
      self.emp_under_sup = emp_under_sup

  def add_emp(self, emp):
    if emp not in self.emp_under_sup:
      self.emp_under_sup.append(emp)

class Supervisor(Employee):
  raise_amount = 1.06

  def __init__(self, first, last, id, pay, emp_under_sup = None):
    super().__init__(first, last, id, pay)
    if emp_under_sup is None:
      self.emp_under_sup = []
    else:
      self.emp_under_sup = emp_under_sup

  def add_emp(self, emp):
    if emp not in self.emp_under_sup:
      self.emp_under_sup.append(emp)
      Manager.add_emp(self, emp)

您可以看到,在Supervisor类的add_emp方法下,我试图调用Manager类的add_emp方法。这样,每当我创建新员工并将其添加到主管的emp_under_sup列表时,该列表也将添加到经理的emp_under_sup列表中。这样的想法是,每位员工都应由经理进行监督,而不必明确地表态。

换句话说,我说:

mng1 = Manager('Jose', 'Federosa', 1, 80000)
sup1 = Supervisor('Jake', 'Derber', 2, 70000)
mng1.add_emp(sup1)
dev1 = Developer('Rob', "M", 3, 60000, 'Python and Java')
sup1.add_emp(dev1)
mng1.info()

然后我希望输出为:

Manager's ID: 1 
Full name: Jose Federosa 
Salary: 80000 
Employee's under supervision: Jake Derber Rob M

但是,从Supervisor类的add_emp方法内部调用Manager.add_emp(self,emp)不能正常工作。有人可以解释为什么这行不通吗?

1 个答案:

答案 0 :(得分:1)

给每个员工一个manager属性,并在Manager.add_emp()中进行设置。然后Supervisor.add_emp()可以得到主管的经理,并致电该经理的add_emp()

class Employee:
  num_of_emps = 0
  raise_amount = 1

  def __init__(self, first, last, id, pay):
    self.first = first
    self.last = last
    self.id = id
    self.pay = pay
    self.manager = None

  def set_manager(self, mgr):
    self.manager = mgr

class Manager(Employee):
  raise_amount = 1.08

  def __init__(self, first, last, id, pay, emp_under_sup = None):
    super().__init__(first, last, id, pay)
    if emp_under_sup is None:
      self.emp_under_sup = []
    else:
      self.emp_under_sup = emp_under_sup

  def add_emp(self, emp):
    if emp not in self.emp_under_sup:
      self.emp_under_sup.append(emp)
      emp.set_manager(self)

class Supervisor(Employee):
  raise_amount = 1.06

  def __init__(self, first, last, id, pay, emp_under_sup = None):
    super().__init__(first, last, id, pay)
    if emp_under_sup is None:
      self.emp_under_sup = []
    else:
      self.emp_under_sup = emp_under_sup

  def add_emp(self, emp):
    if emp not in self.emp_under_sup:
      self.emp_under_sup.append(emp)
      if self.manager:
          self.manager.add_emp(emp)