为什么我的变异函数不能正常工作?

2024-06-23 19:08:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将加薪函数应用于类中的一个变量,但当我调用该函数时,它会给我一个属性错误,表示该变量在所述类中不存在,因为我知道它在那里,并且我以与所教类似的方式编写了它。我已经给出了其中的两个类和一个函数调用。你知道吗

我尝试将缺少的属性添加到正在从中继承的主类的参数中,并在不同的类上调用它以查看是否有区别。你知道吗

编辑以删除问题不需要的代码。你知道吗

class Employee:

    pay_raise = 1.04

    def __init__(self, name, eNumber, hDate):
        self.__name = name
        self.__number = eNumber
        self.__date = hDate

    def raise_pay(self):
        self.__payrate = self.__payrate * self.pay_raise

class ProductionWorker(Employee):


    def __init__(self, name, eNumber, hDate, sNumber, pay):

        Employee.__init__(self, name, eNumber, hDate)

        self.__shiftNumber = sNumber
        self.__payrate = pay

    def set_payrate(self, pay):
        self.__payrate = pay

    def get_payrate(self):
        return self.__payrate

#newEmp is object created of ProductionWorker class. Is in tester file in main function.
newEmp.raise_pay()

期望将self.\u payrate乘以加薪,并在打印报表中进一步显示新的工资率。当前运行时,我得到的输出是“AttributeError:'ProductionWorker'对象没有属性'\u Employee\u payrate'”


Tags: 函数nameself属性initdefemployeepay
1条回答
网友
1楼 · 发布于 2024-06-23 19:08:16

存在Name Mangling是为了使具有__payrate等名称的变量在定义它的类之外更难访问。即使是那个类的子类也不能轻松地访问变量。你知道吗

更传统的做法是只使用一个下划线来表示私有属性。然后名称损坏将不适用,您的私有属性将可以在子类中访问。(它们也可以在其他任何地方访问,但是调皮的用户将在自己的风险下访问它们,因为他们知道,如果您决定更改类的内部结构,事情可能会对他们非常不利。)

class Employee:

    pay_raise = 1.04

    def __init__(self, name, eNumber, hDate):
        self._name = name
        self._number = eNumber
        self._date = hDate

    def raise_pay(self):
        self._payrate = self._payrate * self.pay_raise

class ProductionWorker(Employee):


    def __init__(self, name, eNumber, hDate, sNumber, pay):

        Employee.__init__(self, name, eNumber, hDate)

        self._shiftNumber = sNumber
        self._payrate = pay

    def set_payrate(self, pay):
        self._payrate = pay

    def get_payrate(self):
        return self._payrate

newEmp = ProductionWorker("Fred", 1, 1, 1, 100)
newEmp.raise_pay()
print(newEmp.get_payrate())

结果:

104.0

奖励风格小贴士:

  • 如果Employee的方法访问_payrate,那么您应该在Employee的__init__中初始化它,即使您必须给它一个占位符值。你知道吗
  • getter和setter通常使用@property修饰符实现,这使得访问公共值更容易。你知道吗

你知道吗

class Employee:

    pay_raise = 1.04

    def __init__(self, name, eNumber, hDate):
        self._name = name
        self._number = eNumber
        self._date = hDate

        self._payrate = 0

    @property
    def payrate(self):
        return self._payrate

    @payrate.setter
    def payrate(self, value):
        self._payrate = value

    def raise_pay(self):
        self.payrate *= self.pay_raise

class ProductionWorker(Employee):
    def __init__(self, name, eNumber, hDate, sNumber, pay):

        Employee.__init__(self, name, eNumber, hDate)

        self._shiftNumber = sNumber
        self.payrate = pay


newEmp = ProductionWorker("Fred", 1, 1, 1, 100)
newEmp.raise_pay()
print(newEmp.payrate)

最后,最好不要使用getter或setter,如果它们所要做的只是获取和设置私有值,而不更改任何其他内容。只需使用一个普通的旧属性。你知道吗

class Employee:

    pay_raise = 1.04

    def __init__(self, name, eNumber, hDate):
        self._name = name
        self._number = eNumber
        self._date = hDate

        self.payrate = 0

    def raise_pay(self):
        self.payrate *= self.pay_raise

class ProductionWorker(Employee):
    def __init__(self, name, eNumber, hDate, sNumber, pay):

        Employee.__init__(self, name, eNumber, hDate)

        self._shiftNumber = sNumber
        self.payrate = pay


newEmp = ProductionWorker("Fred", 1, 1, 1, 100)
newEmp.raise_pay()
print(newEmp.payrate)

相关问题 更多 >

    热门问题