You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python OOP问题:如何跨类访问私有属性并实现员工薪资计算

解决Python OOP测试中的Salary私有属性访问问题

你不需要直接去访问Salary类的私有属性,因为它已经为__base_pay和__bonus提供了公开的get/set方法,这是面向对象封装设计的标准用法,直接调用这些方法就可以完成需求。

先看你现有代码里的问题:

  • set_salary方法里错误地把self.__salary当成可调用函数,还试图做加法,但self.__salary是Salary类的实例,不是函数,也不能直接相加
  • get_salary方法直接返回了Salary实例,而不是要求的bonus与base_pay之和

下面是修正后的Employee类方法实现:

class Salary:

    def __init__(self, base_pay=0, bonus=0):
        self.__base_pay = base_pay
        self.__bonus = bonus

    def set_bonus(self, y):
        self.__bonus = y

    def get_bonus(self):
        return self.__bonus

    def set_base_pay(self, y):
        self.__base_pay = y

    def get_base_pay(self):
        return self.__base_pay

class Employee:
    
    def __init__(self, name='', base_pay=0, bonus=0):
        self.__name = name 
        self.__salary = Salary(base_pay, bonus)


    def set_name(self, x):
        self.__name = x

    def get_name(self):
        return self.__name

    def set_salary(self, bonus, base_pay):
        # 调用Salary实例的set方法设置对应值
        self.__salary.set_bonus(bonus)
        self.__salary.set_base_pay(base_pay)

    def get_salary(self):
        # 调用Salary实例的get方法获取值后求和返回
        return self.__salary.get_bonus() + self.__salary.get_base_pay()

关键说明:

  1. Salary类的set_bonus、set_base_pay方法专门用来修改私有属性的值,get_bonus、get_base_pay用来获取私有属性的值,这是类设计者提供的合法操作入口
  2. 不要尝试直接访问self.__salary.__base_pay这类私有属性——Python的双下划线私有属性会做名字修饰(实际变成_Salary__base_pay),虽然技术上能绕过,但会破坏封装性,违背类的设计意图

测试一下这个实现:

emp = Employee("Alice", 5000, 1000)
print(emp.get_salary())  # 输出6000

emp.set_salary(1500, 5500)
print(emp.get_salary())  # 输出7000

内容的提问来源于stack exchange,提问作者Cyantific

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:43:22