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()
关键说明:
- Salary类的
set_bonus、set_base_pay方法专门用来修改私有属性的值,get_bonus、get_base_pay用来获取私有属性的值,这是类设计者提供的合法操作入口 - 不要尝试直接访问
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
相关产品推荐
相关产品推荐

