如何在 Python 中的普通 class 中使用数据 class 中的特定变量?

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

所以我想做一个class可以当包包用的。我只是想在那个袋子里做 2 个函数:一个函数在袋子里添加一个项目并添加指定数量的函数,一个函数取出一个项目和该项目的指定数量。

对于添加项目功能,我希望能够添加一个具有一定数量的新项目,如果该项目已经在列表中,则将添加的数量添加到该项目的现有数量。

对于取出物品功能,如果要取出的物品数量与背包中已有的数量相同,则物品从列表中删除。如果要取出的数量少于袋中的数量,则减少该物品的数量。如果要取出的数量多于包中的数量,则会出现简单的错误消息。当然,如果要取出的项目不在列表中,则会出现错误消息。

包使用列表来存储物品。我希望项目使用 dataclass 来存储项目的数量和名称。我已经做了这个:

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)

此代码无效。问题是我不知道如何使用和更改数据class 中的特定变量的属性。在这种情况下,它正在更改特定项目的数量。我遇到的另一个问题是我不知道怎么说“如果这个数量的这个项目在袋子里......”甚至是:

if item in self.liste_item:

在这一行中,我想检查特定项目是否在列表中。问题是它根本不起作用,代码认为包中的物品不在包中。它仅在我进行更改时有效:

if item not in self.liste_item:

这对我来说毫无意义。请帮我解决这个问题。

Item.amount 不是 class 属性;它只是一个准声明的 instance 属性。 dataclass 装饰器的目的是以相当侵入性的方式使用 class 语句的内容来创建稍后在您的程序中使用的“实际”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)

可能就是这样。你可以试试看。我只是为你编码 我正在使用词典来保护所有人。希望你能看到你如何访问变量 :) 给你一张图片因为我要转储以在此处正确获取它 xD