簡體   English   中英

從組件 class 訪問復合 class 字段

[英]Access Composite class fields from Component class

我有兩個類'Employee'(復合類)和'Salary'(組件類)。

我想在“Salary”class 中獲取名為“self.abc”的變量(在 Employee 類中定義)的值。 我怎么能得到那個?

目前我收到一個錯誤AttributeError: 'Salary' object has no attribute 'abc' 請幫忙。

我不想在這里使用 inheritance 方法。

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)

一種解決方案是將Employee object 作為參數傳遞給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.pay是,則obj_emp.obj_salary.pay不會更新,在以下代碼中的含義:

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

最后一個print語句將打印 600,而不是 700。

如果您確實需要在Salary中動態引用pay ,您可以始終使用self.parent.pay而不是self.pay 這將引用連接的Employee對象的pay值。

您必須在初始化時或之后明確告知Salary thay 信息。 您可以將abc值與pay一起傳遞給初始化程序:

class Salary:
    def __init__(self, pay, abc):
        self.employee_abc = abc

然后在Employee.__init__

self.obj_salary = Salary(self.pay, self.abc)

或為Salary提供它是其成員的Employee實例並通過它訪問abc

self.obj_salary = Salary(self.pay, self)

第一種方式的好處是您只需要告訴Salary足夠的信息以使其能夠完成工作,這很好。 您不希望Salary嚴重依賴於Employee的設計。

第二種方法的好處是,如果您更改Employee self.abc中的 self.abc,它也會自動反映在Salary中(盡管這也可能被視為不利方面)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM