【问题标题】:Class add property on all objects in python类在python中的所有对象上添加属性
【发布时间】:2021-03-10 05:00:50
【问题描述】:

我在 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)

在我的 main 中,我设置了 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)

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

【问题讨论】:

    标签: python function class properties initialization


    【解决方案1】:

    好的,看起来两个 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 2014-08-11
      • 1970-01-01
      • 2021-08-11
      • 2013-06-29
      • 1970-01-01
      相关资源
      最近更新 更多