【发布时间】:2021-10-08 23:39:10
【问题描述】:
我正在使用字典在 python 中制作一个简单的实体组件系统(我听说它们在某种程度上具有更好的性能),但我不想访问像foo['bar']['x'] 这样的数据,我想访问它更像foo.bar.x(只是个人喜好)
所以我做了这个代码
class Entity(dict):
def __init__(self, dictionary={}):
super().__init__(dictionary)
def __getattr__(self, attribute):
return self[attribute]
foo = Entity([('PositionComponent', {'x': 0, 'y': 0})])
所以,我可以使用 foo.PositionComponent 访问 PositionComponent
但我无法以foo.PositionComponent.x
我怎样才能让它工作?有没有更好的方法来制作我已经制作的东西?
更新
我用python做了三个版本的同一个ECS
- 使用实体类而不扩展 dict
foo.component(bar).x(foo.component 中的 for 循环) - 使用实体类扩展字典
foo['bar']['x'] - 使用实体类扩展 dict 并使用自定义 __getattr__
foo.bar.x访问组件
使用粒子系统,屏幕上随时有133个粒子,作为测试我得到了每个ECS的FPS
这是结果:
- FPS 大约 750
- FPS 大约 1050
- FPS 大约 500
因此这证明使用自定义 __getattr__ 会使代码运行速度比使用普通字典慢 2 倍
屏幕上的最大粒子数
(左:FPS,右粒子)
(禁用颜色,即使半径为 0 也会绘制圆)
(12000 达到 30 FPS)
【问题讨论】:
标签: python python-3.x dictionary