我正在研究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 方法,并提出了解决方案。我的问题是相关的,但在那里没有答案
答案 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)