首页 > 解决方案 > 从组件类访问复合类字段

问题描述

我有两个类'Employee'(复合类)和'Salary'(组件类)。

我想在“Salary”类中获取名为“self.abc”(在 Employee 类中定义)的变量的值。我怎么能得到那个?

目前我收到一个错误AttributeError: 'Salary' object has no attribute 'abc'。请帮忙。

我不想在这里使用继承方法。

class Employee:
    def __init__(self, pay, bonus):
        self.abc = 100
        self.pay = pay
        self.bonus = bonus
        self.obj_salary = Salary(self.pay)
        self.annual_salary()
 
    def annual_salary(self):
        print("Total: " + str(self.obj_salary.get_total() + self.bonus))


class Salary:
    def __init__(self, pay):
        self.pay = pay
 
    def get_total(self):
        print(self.abc) # want to get 'abc' value here from 'Employee' class
        return (self.pay*12)
 
 
obj_emp = Employee(600, 500)

标签: pythonpython-3.xoop

解决方案


一种解决方案是将Employee对象作为参数传递给Salary构造函数,如下所示:

class Employee:
    def __init__(self, pay, bonus):
        self.abc = 100
        self.pay = pay
        self.bonus = bonus
        self.obj_salary = Salary(self)
        self.annual_salary()
 
    def annual_salary(self):
        print("Total: " + str(self.obj_salary.get_total() + self.bonus))


class Salary:
    def __init__(self, parent):
        self.pay = parent.pay
        self.parent = parent
 
    def get_total(self):
        print(self.parent.abc)
        return (self.pay*12)
 
 
obj_emp = Employee(600, 500)

注意在上面的代码中,obj_emp.obj_salary.pay如果是,将不会被更新obj_emp.pay,在下面的代码中的含义:

obj_emp = Employee(600, 500)
obj_emp.pay = 700
print(obj_emp.obj_salary.pay)

最后一条print语句将打印 600,而不是 700。

如果您确实需要在pay内动态引用Salary,则始终可以使用self.parent.pay而不是self.pay; 这将引用连接Employee对象的pay值。


推荐阅读