社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

在Python中,将对象作为值存储在key:value对中是否安全?

Caritas • 3 年前 • 1177 次点击  

我在设计RPG背后的机械装置。有物品、玩家、NPC等类。玩家类有库存和装备属性。设备是一个字典列表,例如:

player1.equipment = [{item_slot_a:item_a}, {item_slot_b:item_b}, ..., {item_x:item_x}]

在这里 item_slot_a 指一些任意的“物品”槽,如头盔、靴子、手套等,以及 item_a 指的是Item类、item1或类似的实例。因此,请注意,整个对象被存储为key:value字典对的值。

这样行吗?

将整个对象作为值传递是否安全、高效、可靠?直到我测试了这个系统,我才注意到这会发生 player.equip(thing) 作用我有一个(希望)聪明的方法来为装备项目确定合适的装备槽,然后我。。。嗯……”将“项”作为键:值对绑定到项槽。我打印了清单来测试equip()函数,看到了以下内容:

player1 = create_player('Bob', 'reaver', 1)
player1.show_equipment()
player1.equip(piece_of_gear)
player1.show_equipment()
Output: [{'helmet': None}, {'torso': None}, {'hand': <__main__.Gear object at 0x000001FF200BC0D0>}, {'legs': None}, {'foot': None}, {'neck': None}, {'ring': None}, {'ear': None}, {'charm': None}, {'mh_weapon': None}, {'oh_weapon': None}, {'twohand_weapon': None}]

如果我是正确的,这是一个打印函数,它在内存中返回一个表示对象的地址。这代表什么问题吗?如果我只是使用对象作为存储机制来检索相关值(其预期用途),我通常不会看到这种情况,这可能只是我没有正确设计 show_equipment() 作用

请尽可能对我的代码的结构和可靠性提出建议。如有任何意见,将不胜感激。

作为参考,我的 player.show_equipment 函数如下所示:

    print('Equipment:')
    print(self.equipment)
    return\`\`\`

显然,如果我想准确地打印设备列表中的内容,我可以在内存中检索对象(这将是Item类的一个实例),然后打印Item。名称(这只是一个字符串,我是这样写的)而不是打印整个项目。我对创建包含对象的词典列表的安全性和有效性更感好奇。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130408
 
1177 次点击  
文章 [ 1 ]  |  最新文章 3 年前
flakes
Reply   •   1 楼
flakes    3 年前

将整个对象作为值传递是否安全、高效、可靠?

对Python中的一切都是对象。

如果我是正确的,这是一个打印函数,它在内存中返回一个表示对象的地址。这代表什么问题吗。。。打印函数返回内存中表示对象的地址。这代表什么问题吗?

这里没有问题。这完全取决于环境 __repr__ 类的重写。如果没有,那么默认实现是打印 id() 对象及其类类型的。例如。

>>> class Test: pass
>>> print(Test())
<__main__.Test object at 0x00000185FF1C5D30>

>>> class Test:
...     def __repr__(self): return "Tada!"

>>> print(Test())
Tada!

请尽可能对我的代码的结构和可靠性提出建议。如有任何意见,将不胜感激。

我宁愿使用数据类来表示条目,而不是使用非类型化的dict列表来存储条目。这些类型的类是存储纯数据和实现以下功能的理想方式 __报告__ , __init__ 还有其他对你有用的方法!例如:

from dataclasses import dataclass
from typing import Optional


@dataclass
class Gear:
    name: str
    attack_rating: int = 0
    magic_rating: int = 0
    defense_rating: int = 0


@dataclass
class Equipment:
    helmet: Optional[Gear] = None
    torso: Optional[Gear] = None
    hand: Optional[Gear] = None

使用这个类,你可以轻松构建你的玩家配置!

>>> player_equipment = Equipment()
>>> player_equipment.helmet = Gear("Tiara", magic_rating=15)
>>> print(player_equipment)
Equipment(helmet=Gear(name='Tiara', attack_rating=0, magic_rating=15, defense_rating=0), torso=None, hand=None)