[英]Encapsulation in Python
考虑一个班级员工
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
。
也许更常见的情况可能是某人的身份证号码,例如税号或社会安全号码。 在这种情况下,您可以使用遮蔽算法:
class Person:
def __init__(self):
self._ssn = None
@property
def ssn(self):
return f'{self._ssn[:3]}-XX-XXXX'
在这里,所有调用者在使用该属性访问它时都会看到 SSN 的隐藏版本。
使用__
会导致外部调用者无法直接访问变量,但有一些方法可以绕过该封装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.