【问题标题】:Using inheritance in python在python中使用继承
【发布时间】:2013-04-21 07:15:44
【问题描述】:

这是我的家庭作业,我之前在网站上看到过它,但看起来它没有解决,而且我收到的错误消息与以前提出该问题的人不同。

问题的第一部分是定义子类 Worker,它继承自 Employee 并包含一个属性,该属性引用另一个员工,该员工是该员工的经理。您应该定义一个方法 get_manager 来返回工人的经理。

例子:

worker = Worker("Fred", 52000, myboss)

问题的第二部分是定义继承自Employee 的子类Executive 并包含一个引用年度奖金的属性。

您应该覆盖工资方法以根据他/她的薪水和奖金计算高管薪酬。应该在Executive类的工资方法定义中使用Employee的工资方法。

例子:

executive = Executive("Kerry", 520000, 1040000)

我的代码写在下面,我得到的错误消息是:'global name 'salary' is not defined' in line 'Employee.init(self, name, Salary)' for class行政人员(适用于工人阶级)。为什么会出现该错误,我该如何解决?

感谢您的帮助!

class Employee(object):
    def __init__(self, name, salary):
        self._name = name
        self._salary = salary

    def my_name(self):
        return self._name

    def wage(self):
        return self._salary/26   # fortnight pay

class Worker(Employee):
    def __init__(self, name, salary, manager):
        Employee.__init__(self, name, salary)
        self._manager = manager

    def getManager(self):
        return self._manager

class Executive(Employee):
    def __init__(self, name, wage, yearlyBonus):
        Employee.__init__(self, name, salary) 
        self._yearlyBonus = yearlyBonus

    def wage(self):
        return Employee.wage(self)

【问题讨论】:

  • 您在计算Executive 的工资时忘记考虑self._yearlyBonus
  • 我更正了我的代码,但我仍然收到错误消息“您的主管工资有误”...
  • @kate88 这是实际的错误消息吗?它来自哪里? yearlyBonus 不应该一年只用一次还是也除以 26?
  • 谢谢托拜厄斯!我只需要将它除以 26!
  • 感谢大家的帮助,代码现在运行良好!

标签: python class inheritance


【解决方案1】:

错误很明显。 salary 没有在Executive__init__ 方法中定义。

您使用wage 作为__init__ 的参数,但在调用父类的__init__ 时使用salary,因此您应该坚持使用一个变量名:

class Executive(Employee):
    def __init__(self, name, salary, yearlyBonus):
        Employee.__init__(self, name, salary) 

此外,您可以使用*args 绕过每次输入所有这些参数:

class Executive(Employee):
    def __init__(self, *args, yearlyBonus):
        super(Executive, self).__init__(*args)

使用super() 而不是调用父类的__init__ 方法。它使多重继承更容易一些。

【讨论】:

  • 谢谢,我更正了我的代码,但我仍然收到错误消息“您的主管工资有误”...
  • @kate88:这条消息是从哪里来的?你得到了什么,正确的工资是多少?
【解决方案2】:

只需查看发生错误的代码,并继续查看直到发现不匹配的部分:

def __init__(self, name, wage, yearlyBonus):
    Employee.__init__(self, name, salary) 

【讨论】:

  • 谢谢!我更正了我的代码,但我仍然收到错误消息“你的主管工资有误”...
  • 我认为第二个问题是由于您对问题陈述的解释。然而,这不是 Stack Overflow 的主题,因为它不是编程问题,而是你们中的一个人理解你的任务。
【解决方案3】:

是的,您的 init 函数没有名为salary 的变量,当您将其传递给Employee 时会出错。init

class Executive(Employee):
    def __init__(self, name, wage, yearlyBonus):
        Employee.__init__(self, name, salary) 

当你这样做时

executive = Executive("Kerry", 520000, 1040000)

哪一项与薪水相关?将其作为员工初始化方法传递。如果你用 super 调用 Employee 构造函数会更好

从这个方法猜测

def wage(self):
        return self._salary/26   

也许这就是你想要的(虽然不知道如何计算 yearlyBonus)

 class Executive(Employee):
        def __init__(self, name, wage, yearlyBonus):
            Employee.__init__(self, name, wage * 26) 

【讨论】:

    【解决方案4】:

    Executive.__init__的声明:

    def __init__(self, name, wage, yearlyBonus):
    

    它没有在其中声明一个名为salary 的变量。但是当你调用超类的构造函数时,

        Employee.__init__(self, name, salary) 
    

    您要求 Python 将名为 salary 的变量的值作为第三个参数传递。 Python 只是抱怨这个变量不存在。

    我想您可以从那里弄清楚如何解决它。 :-)

    【讨论】:

    • 谢谢,我更正了我的代码,但我仍然收到错误消息“您的主管工资有误”
    猜你喜欢
    • 2015-06-25
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多