簡體   English   中英

2個或更多類的屬性之間的依賴關系

[英]Dependencies between attributes of 2 and more classes

是否可以初始化具有相互依賴的屬性的類的實例(不是循環方式)?

今天,我使用字典而不是類,如下所示:

dictA = {'A1': 10}
dictB = {'B1': 2}
dictB['B2'] = dictA['A1'] * dictB['B1']
dictA['A2'] = dictB['B2'] * 3  # dictA['A1'] * dictB['B1'] * 3

print(dictA)  # {'A1': 10, 'A2': 60}
print(dictB)  # {'B1': 2, 'B2': 20}

當我嘗試用類表達上述內容時,我最終得到RecursionError: maximum recursion depth exceeded

class A:
    def __init__(self):
        self.A1 = 10
        self.A2 = B().B2 * 3

class B:
    def __init__(self):
        self.B1 = 2
        self.B2 = self.B1 * A().A1
    
a = A()
b = B()

字典(類)是分開的,因為它們代表不同類型的數據(例如員工和時間)。

您需要使初始化程序非循環。 然后你可以使用@property懶惰地評估屬性

class A:
    def __init__(self):
        self.A1 = 10

    @property
    def A2(self):
        return B().B2 * 3


class B:
    def __init__(self):
        self.B1 = 2

    @property
    def B2(self):
        return self.B1 * A().A1


a = A()
b = B()

print(a.A1, a.A2, b.B1, b.B2)

結果:

10 60 2 20

另一種選擇:

class A:
    def __init__(self):
        self.A1 = 10
    def add_A2(self, x):
        self.A2 = x.B2 * 3

class B:
    def __init__(self):
        self.B1 = 2
    def add_B2(self, x):
        self.B2 = self.B1 * x.A1
    
a = A()
b = B()
b.add_B2(a)
a.add_A2(b)

你得到一個RecursionError因為你創建了一個B的實例來設置A2 ,並且要創建一個B的實例,你需要創建一個A的實例來設置B2 您將繼續以循環方式創建AB的實例。

您可以聲明 class 屬性,無需創建 class 的實例即可使用。 請注意,對於 class 的所有實例,此值始終相同。 因此,您可以將其用於像days_of_week = 7這樣的值,但不能用於age = 34的人,因為人的年齡並不總是 34 歲。

假設A1A2可以是 class 屬性,它們始終相同,您可以執行以下操作:

class A:
    A1 = 10
    def __init__(self):
        self.A2 = B.B1 * self.A1 * 3
    
class B:
    B1 = 2
    def __init__(self):
        self.B2 = self.B1 * A.A1
        
a = A()
b = B()
print(a.A1, a.A2)
print(b.B1, b.B2)

暫無
暫無

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

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