PyYAMLの読みやすさが気に入っており、これをいくつかのオープンソースプロジェクトで使いたいと思っています。私はJSONの代替として取り組んでいます。PyYAMLとコンポジション、属性エラー
しかし、私は構成を使ってオブジェクトを構成する方法を正確に理解するのに苦労しています。私はこの質問を開いた:PyYAML - how to deal with compositonとそれは情報を読むことの面ではなく、完全なプログラムのコンテキストで動作するように見えた。
import yaml
import data
class DungeonObject(yaml.YAMLObject):
yaml_tag = u'!DungeonObject'
def __init__(self, x, y, char, name, blocks=False, fighter=None):
self.x = x
self.y = y
self.char = char
self.name = name
self.blocks = blocks
self.fighter = fighter
if self.fighter:
self.fighter.owner = self
def __repr__(self):
return "%s(x=%r, y=%r, char=%r, name=%r, blocks=%r fighter=%r)" % (self.__class__.__name__, self.x, self.y, self.char, self.name, self.blocks, self.fighter)
class Fighter(yaml.YAMLObject):
yaml_tag = u'!Fighter'
#combat-related properties and methods (monster, player, NPC).
def __init__(self, hp, defense, strength):
self.hp = hp
self.base_defense = defense
self.base_strength = strength
def __repr__(self):
return "%s(hp=%r, defense=%r, strength=%r)" % (self.__class__.__name__, self.hp, self.defense, self.strength)
monsters = {DungeonObject.name : DungeonObject for DungeonObject in yaml.load_all(data.monsterdata)}
print (monsters)
そして、私のYAMLファイル:これにより
monsterdata = """
---
!Fighter &fighter_component
hp: 20
defense: 0
strength: 4
!DungeonObject
x: x
y: y
char: 'o'
name: 'orc'
blocks: True
fighter: fighter_component
---
!Fighter &fighter_component
hp: 9
defense: 0
strength: 10
!DungeonObject
x: x
y: y
char: 't'
name: 'troll'
blocks: True
fighter: fighter_component
"""
、私はエラーを取得しています: ラインここ
は、私がYAMLifyにしようとしているもののストリップダウン例です32、in monsters = {DungeonObject.name:ダンジョンオブジェクトのダンジョンオブジェクト(yaml.load_all(data.monsterdata)) AttributeError: 'Fighter'オブジェクトに 'name'属性がありません
@Retro文字列の前後の引用符は、{{} 'の代わりに' {!r} 'を使用したものです。前者は '__repr__'(文字列の場合は引用符で囲まれた文字列)の結果を挿入し、後の場合は' __str__'の結果(文字列の場合は余分な引用符を含まない文字列)を挿入します。 – Anthon
ブリリアント、それは多くを助けます - それはすべて今働きます。最終的な問題私は、ファイタークラスには、「ボーナス=合計(get_all_equipped(self.owner)内の装備の装備の装備の装備)」のような、「所有者」の使用を中心としたいくつかの方法があると考えている。 return self.base_strength + bonus' これは今、 'Fighter'オブジェクトにスローされます。属性 'owner'エラーはありません。 私は私のファイタークラス 'if self.fighter:self.fighter.owner'で定義しました。以前はうまくいきましたが、それ以上は動作しません。何か案は? – Retro
'self'に所有者はなく、戦闘機のクラスであれば' get_all_equipped'のパラメータとして 'self.owner'を使うべきではなく、' self.fighter.owner'を使うべきです。しかし、それは実際のコードを見ることなく、単なる推測です。あなたのコードがリビジョン管理下にあることを確認し、定期的にコミットしてから、作業したものやロールバックしたものと比較することができます。 – Anthon