python - 类在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)
为什么会发生这种情况,我该如何解决?
解决方案
好的,看起来两个 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)
推荐阅读
- javascript - 在循环 ForEach 之前等待确认
- html - 导航项下方带有子菜单的全宽下拉菜单
- selenium - 范围报告仅保存 Jenkins 中最后一项作业的最后一项结果
- c# - 如何计算 3d 扫描的腹部周长?
- java - 当二维数组 [][] 和数组 [] 之间的赋值是合法的?
- powershell - 删除一个txt文件除第一行以外的内容
- javascript - 如何修复一个简单的 js 计算器(返回未定义)
- elasticsearch - 如何在弹性搜索中加载数据?
- python - 如何暂停 Python 脚本并让用户在 Linux 终端中输入
- azure - ADFv2中如何根据文件名将文件复制到不同目录