簡體   English   中英

如何在 Python 中的普通 class 中使用數據類中的特定變量?

[英]How do I use a specific variable from a dataclass in a normal class in Python?

所以我想做一個 class 作為一個包。 我只想在那個包里做 2 個功能:一個 function 在包中添加一個項目並添加指定數量,一個 function 取出一個項目和該項目的指定數量。

對於添加項目 function,我希望能夠添加具有一定數量的新項目,如果該項目已經在列表中,則將放入的數量添加到該項目的現有數量中。

對於取出物品function,如果要取出的數量與已放入袋子的數量相同,則將該物品從列表中刪除。 如果要取出的數量少於袋子中的數量,則該物品的數量會減少。 如果要取出的數量多於袋子中的數量,則會出現簡單的錯誤消息。 當然,如果要取出的項目不在列表中,則會出現錯誤消息。

袋子使用列表來存儲物品。 我希望項目使用數據類來存儲項目的數量和名稱。 我已經做了這個:

from dataclasses import dataclass

@dataclass
class Item:
    amount: int
    item1: str


class Bag:
    def __init__(self):
        self.liste_item = []

    def add_item(self, item, quantity):
        if item in self.liste_item:
            Item.amount += quantity
        else:
            self.liste_item.append(Item(quantity, item))
        print(self.liste_item)

    def take_item(self, item, quantity):
        if item in self.liste_item:
            if Item(quantity, item).amount == quantity:
                del item
            elif Item(quantity, item).amount < quantity:
                print(f"You do not have {quantity} {item} in your bag.")
            else:
                Item.amount -= quantity
        else:
            print(f"{item} is not in your bag.")
        print(self.liste_item)

此代碼不起作用。 問題是我不知道如何使用和更改數據類中特定變量的屬性。 在這種情況下,它正在更改特定項目的數量。 我遇到的另一個問題是我不知道該怎么說“如果這個數量的這個物品在包里......”甚至是行:

if item in self.liste_item:

在這一行中,我想檢查特定項目是否在列表中。 問題是它根本不起作用,並且代碼認為袋子里的物品不在袋子里。 它僅在我進行更改時才有效:

if item not in self.liste_item:

這對我來說毫無意義。 請幫我解決一下這個。

Item.amount不是 class 屬性; 它只是一個准聲明的實例屬性。 數據類裝飾器的目的class dataclass的內容來創建稍后在程序中使用的“實際” class。 該過程的一部分是自動生成Item.__init__沿線

def __init__(self, amount, item1):
    self.amount = amount
    self.item1 = item1

因此,您不應該直接向Item.amount添加任何內容。 需要self.liste_item中找到對應的實例並更新。

from dataclasses import dataclass


@dataclass
class Item:
    amount: int
    item1: str


class Bag:
    def __init__(self):
        self.liste_item: list[Item] = []

    def add_item(self, item_name: str, quantity: int):
        for item in self.liste_item:
            if item.item1 == item_name
                item.amount += quantity
                break
        else:
            # Create a new Item instance if no match was found.
            self.liste_item.append(Item(quantity, item_name))

    ...

take_item必須以類似方式重寫。

class Bag:
    bag = {}


def add_item(self, new_item, quantaty):
    if new_item in self.bag:
        self.bag[new_item] += quantaty
        else:
            self.bag[new_item] = quantaty
        
def remove_item(self, item, quantaty):
        if item in self.bag:
            if quantaty > self.bag[item]:
                print(f"Only {self.bag[item]} of {item} left. Cant substract {quantaty}")
            else:
                self.bag[item] -= quantaty
        else:
            pass
        


Kevin = Bag()

Kevin.add_item("sword", 10)
print(Kevin.bag)
Kevin.add_item("sword", 10)
print(Kevin.bag)
Kevin.add_item("stone", 10)
print(Kevin.bag)

Kevin.remove_item("stone", 5)
print(Kevin.bag)
Kevin.remove_item("stone", 6)
print(Kevin.bag)

雲應該是這樣的。 你可以試試看。 我剛剛為您編寫了此代碼,我使用字典來保護所有人。 希望您能看到您如何訪問該變量:) 得到 ua 圖片因為我要轉儲以將其放在這里 xD在此處輸入圖像描述

暫無
暫無

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

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