考虑类雇员
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
emp_obj = Employee('Sam', 50000)
print(emp_obj.name, emp_obj.salary)
我试图在Python中实现封装,以限制对重要数据(如薪金)的访问。为此,我通过将两个下划线作为前缀来声明可变工资为私有。另外,我通过从StackOverflow的以下链接中引用了第二个答案来修改了上面的代码:StackOverflow Link
class Employee:
def __init__(self, name, salary):
self.name = name
self.__salary = salary
@property
def salary(self):
return self.__salary
@salary.setter
def salary(self, salary):
self.__salary = salary
def getSalary(self):
return 'The Salary is {0}' .format(self.salary)
emp_obj = Employee('Sam', 50000)
print(emp_obj.name, emp_obj.salary)
print(emp_obj.getSalary())
我看不出太大的区别。
所以我再次修改了代码:
class Employee:
def __init__(self, name):
self.name = name
#self.__salary = salary
def setSalary(self, salary):
self.__salary = salary
def getSalary():
return salary
emp_obj = Employee('Sam')
emp_obj.setSalary(50000)
print(emp_obj.name)
print(emp_obj.getSalary)
我收到的输出是:
Sam
<bound method Employee.getSalary of <__main__.Employee object at 0x0000019E1B961A58>>
以上输出是什么意思?显然,我的代码无法正常工作。我试图通过传递薪水的值作为参数来设置薪水。请指定错误和解决问题的方法。
我还有另一个疑问-以下划线开头和结尾的Python函数(方法)代表或传达了什么?
def __init__(self):
上面的命令用于初始化Python中的构造函数,在创建类的对象时默认调用该构造函数。
我正在使用Python 3.6.5。
代码已根据@ShadowRanger更改:
print(emp_obj.getSalary())
然后我收到以下输出错误:
Sam
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-21-f115117b2a1c> in <module>()
13 emp_obj.setSalary(50000)
14 print(emp_obj.name)
---> 15 print(emp_obj.getSalary())
TypeError: getSalary() takes 0 positional arguments but 1 was given
要解决打印语句的问题,您可以执行以下操作:
def getSalary(self):
return ....
您忘记了每个实例方法都需要的self
。