Python封装

问题描述 投票:0回答:1

考虑类雇员

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
python oop encapsulation
1个回答
0
投票

要解决打印语句的问题,您可以执行以下操作:

def getSalary(self):
   return ....

您忘记了每个实例方法都需要的self

© www.soinside.com 2019 - 2024. All rights reserved.