首页 > 解决方案 > 类在python中的所有对象上添加属性

问题描述

我在 python 上编程时发现了一个问题。我有 Dinero 类(英语货币),它具有 DnD 中货币的所有属性。

class Dinero:
    
    def __init__(self, copper_pieces, silver_pieces, electrum_pieces, gold_pieces, platinum_pieces) -> None:
        self.copper_pieces = copper_pieces
        self.silver_pieces = silver_pieces
        self.electrum_pieces = electrum_pieces
        self.gold_pieces = gold_pieces
        self.platinum_pieces = platinum_pieces
    
    def __str__(self):
        return "Dinero obtenido:\n  Copper: "+str(self.copper_pieces)+"\n  Silver: "+str(self.silver_pieces)+"\n  Electrum: "+str(self.electrum_pieces)+"\n  Gold: "+str(self.gold_pieces)+"\n  Platinum: "+str(self.platinum_pieces)

    def add_gold(self, gold):
        self.gold_pieces += gold

    def agregar_dinero(self, dinero):
        self.copper_pieces += dinero.copper_pieces
        self.silver_pieces += dinero.silver_pieces
        self.electrum_pieces += dinero.electrum_pieces
        self.gold_pieces += dinero.gold_pieces
        self.platinum_pieces += dinero.platinum_pieces

然后我的班级名为 Mochila(英文包),其中包含项目列表和 Dinero 班级。

import dinero

class Mochila:

    def __init__(self, dinero:dinero.Dinero=dinero.Dinero(0,0,0,0,0), items:list=[]):
        self.items = items
        self.dinero = dinero
    
    def meter_item(self, item):
        self.items.append(item)
    
    def sacar_item(self, item):
        self.items.remove(item)

在我的主要设置中,我设置了 2 个不同的 mochila,而 mochila2 正在获取 mochila1 的 Dinero 的价值。

import dinero
import mochila


mochila1 = mochila.Mochila()
mochila2 = mochila.Mochila()

print(mochila2.dinero)

nuevo_dinero = dinero.Dinero(10, 10,200,10,10)

print(mochila2.dinero)

mochila1.dinero.agregar_dinero(nuevo_dinero)

print(mochila2.dinero)

mochila2.dinero.agregar_dinero(mochila1.dinero)
mochila1.dinero = dinero.Dinero(0,0,0,0,0)

为什么会发生这种情况,我该如何解决?

标签: pythonfunctionclasspropertiesinitialization

解决方案


好的,看起来两个 dinero 实例是相同的,如果你注释掉你的str方法,你会看到它们在内存中占用完全相同的空间,所以:

print(mochila2.dinero)
print(mochila1.dinero) 

你回来了:

<__main__.Dinero object at 0x0000025D90EC0B08>
<__main__.Dinero object at 0x0000025D90EC0B08>

这是因为当您在 mochila 的构造函数中设置默认 dinero 时,它每次都使用相同的默认值,而不是每次都创建一个新实例。要解决这个问题,并且考虑到您可能总是希望一个新的 mochila 以 0 钱开始,请尝试将 dinero 的实例化移动到构造函数:

class Mochila:

    def __init__(self, items: list=[]):
        self.items = items
        self.dinero = Dinero(0, 0, 0, 0, 0)

推荐阅读