班级员工打印方法

时间:2019-06-16 12:51:09

标签: python class methods

我正在研究jupyter笔记本和google colab中的python编程课程。

我不了解这堂课的结果。

class employee_constructor():

  def __init__(self,name,surname,salary):
   self.name=name
   self.surname=surname
   self.salary=salary

  def increasesalary(self,percentage):
    self.salary=self.salary*(1+percentage/100)

  def displayEmployee(self):
     print('this employee is {} and gets {} dollars'.format(emp1.name,emp1.salary))

现在我尝试打印出结果:

emp1=employee_constructor('jose','ferro',1000)
emp2=employee_constructor('manolo','rod','1500')
emp1.displayEmployee
print('before increase',emp1.salary)
emp1.increasesalary(5)
emp1.increasesalary(5)
print('after increase',emp1.salary)

print(emp1.salary)

# this line does not give error and does nothing:
emp1.increasesalary
print(emp1.salary)

# this line gives error:
# increasesalary() missing 1 required positional argument: 'percentage'
emp1.increasesalary()

我不明白为什么在不带括号的情况下运行该方法不会导致任何错误(实际上该方法未运行)而在带括号的情况下(并且不将必需变量传递给错误)

第二,如何避免此类错误?即如果用户未通过任何操作,则假定谷值为零

注意: this question解释了 init 方法,并提出了解决方案。我的问题是相关的,但在那里没有答案

2 个答案:

答案 0 :(得分:3)

  

我不明白为什么在不带括号的情况下运行该方法不会导致任何错误(实际上该方法未运行)而在带括号的情况下(并且不将必需变量传递给错误)

当您通过self引用方法(在对象上下文中的函数,object.method被隐式传递)时,将返回方法对象。但是要实际执行该功能,您需要调用它,即使用括号。

为了娱乐,将返回的方法对象另存为变量,然后调用该变量,您会发现您在执行相同的操作,因为它们引用相同的对象。

现在,当您调用emp1.increasesalary()时,您没有传递导致错误的必需参数percentage。再次注意,self(对象本身)是隐式传递的。

  

如何避免此类错误?即如果用户未通过任何操作,则假定谷值为零

使参数为关键字参数,默认值为0:

def increasesalary(self, percentage=0):
    self.salary = self.salary * (1 + percentage / 100)

答案 1 :(得分:1)

您始终可以在python中使用功能(不带括号):

def f():
    pass

print(f)

这不会调用该函数,而只是打印出其内存位置。因此,包含函数f本身的行是有效的python语句;但它不会调用该函数。


然后:您需要在self方法中使用emp1而不是displayEmployee(self)

def displayEmployee(self):
    print('this employee is {} and gets {} dollars'.format(self.name, self.salary))

更好:

def __str__(self):
    return f"this employee is {self.name} and gets {self.salary} dollars"

那么您可以

print(emp1)