繁体   English   中英

Python 中的封装

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM