簡體   English   中英

2 個構造函數 class 在 1 個構造函數 class 在 Python

[英]2 constructor class in 1 constructor class in Python

我正在嘗試使用此代碼將 2 個構造函數 class 放入 1 個構造函數 class 中,但是:

class Buy:
    def __init__(self, buy_value: float, buy_currency: str) -> None:
        self.buy_value = buy_value
        self.buy_currency = buy_currency
class Sell:
    def __init__(self, sell_value: float, sell_currency: str) -> None:
        self.sell_value = sell_value
        self.sell_currency = sell_currency

class isCash(Buy,Sell):
    def __init__(self, buy_value, buy_currency,sell_value, sell_currency) -> None:
        super().__init__(buy_value, buy_currency)
        super().__init__(sell_value,sell_currency)


obj1 = isCash(Buy(1,"mnt"),Sell(2,"mnt"))
print(obj1.__dict__)

結果

{'buy_value': 2, 'buy_currency': 'mnt'}

如您所見,出售 DICT 已不復存在。 無論如何我可以做到這一點。

{
 "buy": {
   "buy_value": 1,
   "buy_currency": "MNT"
 },
 "sell": {
   "sell_value": 1,
   "sell_currency": "MNT"
 },
}

您的兩個 super() 都將構造函數調用為 Buy,因此 Sell 總是被忽略。 您需要修改第二個 super 以在 Buy 之后顯式調用構造函數。 您可以更新您的購買和銷售 class 以實現您的預​​期命令。 您還應該更正初始化。

class Buy:
    def __init__(self, buy_value: float, buy_currency: str) -> None:
        self.buy = {
            'buy_value': buy_value,
            'buy_currency': buy_currency.upper()
        }

class Sell:
    def __init__(self, sell_value: float, sell_currency: str) -> None:
        self.sell = {
            'sell_value': sell_value,
            'sell_currency': sell_currency.upper()
        }

class isCash(Buy,Sell):
    def __init__(self, buy_value, buy_currency,sell_value, sell_currency) -> None:
        super().__init__(buy_value, buy_currency)
        super(Buy, self).__init__(sell_value, sell_currency)

obj1 = isCash(1,"mnt",2,"mnt")
print(obj1.__dict__)

Output:

{'buy': {'buy_value': 1, 'buy_currency': 'MNT'},
 'sell': {'sell_value': 2, 'sell_currency': 'MNT'}}

super().__init__以定義的順序調用第一個父類。 因此,您的第二個會覆蓋第一個的結果。 您需要使用顯式轉發:

    Buy.__init__(self, buy_value, buy_currency)
    Sell.__init__(self, sell_value, sell_currency)

但是,您調用isCash的方式是錯誤的。 你所需要的:

obj1 = isCash(1,"mnt",2,"mnt")

您是否真的想使用封裝,而不是 inheritance?

class isCash:
    def __init__(self, buy, sell):
        self.buy = buy
        self.sell = sell

該定義符合您的用法。

如果您打算將字典作為 class 的兩個不同屬性,那么您不需要繼承,它將按方法解析順序調用構造函數(參見此處),而是需要封裝。 下面的代碼應該適用於這個實現:

import json

class Buy:
    def __init__(self, buy_value: float, buy_currency: str) -> None:
        self.buy_value = buy_value
        self.buy_currency = buy_currency
class Sell:
    def __init__(self, sell_value: float, sell_currency: str) -> None:
        self.sell_value = sell_value
        self.sell_currency = sell_currency

class isCash:
    def __init__(self, buy_value, buy_currency,sell_value, sell_currency) -> None:
        self.buy = Buy(buy_value, buy_currency)
        self.sell = Sell(sell_value,sell_currency)


obj1 = isCash(1,"mnt",2,"mnt")
print(json.loads(json.dumps(obj1, default=lambda o: o.__dict__)))

暫無
暫無

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

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