实体/组件容器,用于实现继承上的组合。
项目描述
关于
实体/组件容器,用于实现继承上的组合。
安装
使用pip安装此库
pip install tcod-ec
如果已安装tcod
且版本低于14.0.0
,则import tcod.ec
将失败。请删除或更新tcod
以解决这个问题。
示例
tcod.ec.ComponentDict
是一个包含匿名组件的容器,所有组件都有一个唯一的类。键是组件的类,并且只能分配该类的单个实例。
>>> import attrs
>>> import tcod.ec
# Anonymous components don't need special treatment.
>>> @attrs.define
... class Position:
... x: int = 0
... y: int = 0
>>> @attrs.define
... class Graphic:
... ch: str = "@"
# ComponentDict stores a single instance for every unique class, in this case: [str, Position, Graphic]
>>> entity = tcod.ec.ComponentDict(["Hello world", Position(1, 2), Graphic("!")])
>>> {Position, Graphic} in entity # Check if an entity has a set of components.
True
>>> entity[str] # Access components using the class as the key.
'Hello world'
>>> entity[Position].y = 10
>>> entity[Position]
Position(x=1, y=10)
>>> entity[Graphic] = Graphic("?") # Explicit setting of the component.
>>> entity
ComponentDict(['Hello world', Position(x=1, y=10), Graphic(ch='?')])
>>> entity.set(Graphic("#")) # Implicit setting.
ComponentDict(['Hello world', Position(x=1, y=10), Graphic(ch='#')])
>>> del entity[Graphic] # Components can be deleted.
>>> entity
ComponentDict(['Hello world', Position(x=1, y=10)])
# Abstract components can be registered with tcod.ec.abstract_component.
>>> @tcod.ec.abstract_component
... @attrs.define
... class Base:
... pass
>>> @attrs.define
... class Derived(Base):
... pass
>>> entity.set(Derived()) # Derived classes may be set implicitly.
ComponentDict(['Hello world', Position(x=1, y=10), Derived()])
>>> entity[Base] = Derived() # Or explicitly assigned to the abstract key.
>>> Base in entity
True
>>> entity[Base] # Any derived classes use the base class as the key.
Derived()
>>> entity
ComponentDict(['Hello world', Position(x=1, y=10), Derived()])
tcod.ec.Composite
是匿名组件的集合。与ComponentDict
不同,它可以存储具有相同类的多个组件。组件还可以通过父类访问。这适用于多重继承。
虽然这个类看起来像是ComponentDict
的全面升级,但它使用起来要复杂得多。它混合类继承和组合的方式,如果使用不当可能会导致反模式。任何用作键的类都将返回零、一个或多个实例,必须对此进行考虑。如果不确定,则应使用更简单的ComponentDict
。
>>> @attrs.define
... class Body:
... name: str
... hp: int
>>> entity = tcod.ec.Composite([Position(1, 2), Graphic("!"), Body("torso", 10), Body("head", 5)])
>>> {Position, Graphic, Body} in entity
True
>>> (pos,) = entity[Position] # Use unpacking logic to verify the number of elements.
>>> pos.y = 10
>>> entity[Position]
[Position(x=1, y=10)]
>>> entity[Graphic] = [Graphic("?")] # New sequences can be assigned, this deletes all previous instances of that key.
>>> entity[Graphic]
[Graphic(ch='?')]
>>> del entity[Graphic]
>>> entity[Graphic] # Missing keys return an empty sequence instead of KeyError.
()
>>> entity[Body]
[Body(name='torso', hp=10), Body(name='head', hp=5)]
>>> entity.extend([Body("legs", 10), Body("arms", 10)]) # Use append or extend to add new instances.
>>> for body in list(entity[Body]): # Make a copy of the sequence if you intend to remove values during iteration.
... body.hp -= 2
... if body.name == "torso":
... entity.remove(body)
>>> entity[Body]
[Body(name='head', hp=3), Body(name='legs', hp=8), Body(name='arms', hp=8)]
# All objects can be accessed at once using `object`.
>>> entity[object]
[Position(x=1, y=10), Body(name='head', hp=3), Body(name='legs', hp=8), Body(name='arms', hp=8)]
>>> entity[object] = ("Hello", "world")
>>> entity
Composite(['Hello', 'world'])
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
tcod-ec-2.2.1.tar.gz (19.9 kB 查看哈希值)
构建分发
tcod_ec-2.2.1-py3-none-any.whl (10.9 kB 查看哈希值)
关闭
tcod-ec-2.2.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 40caffea881b068b3133b861d93cf250e17ed4c07459ab781eea96c5b5801b23 |
|
MD5 | 77a3ae8547904cbbe06533bf835126d9 |
|
BLAKE2b-256 | f2967b375f63cdd22c3ead28b6622fe3a5338cc653062584a05c57d2defa8ec5 |
关闭
tcod_ec-2.2.1-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a69b2004793f52553012ca54b2dbf58bbd047181a5f02dc3305607d478a08016 |
|
MD5 | 1343c0b530d64256b94153fa4369594c |
|
BLAKE2b-256 | 6dad1a2226da8ee754f61a913fba1b68707ed38970088fbd570f97f412fc20fd |