1

私が書いているPythonゲームには、2つのクラスがあります。ShipType、およびShip。Shipオブジェクトは、独自の名前、年齢、在庫などで特定の宇宙船を表します。ShipTypeオブジェクトは、独自の名前、ベースで、船の「ライン」を表します(Mazda Protegeは車の「ライン」です)。そのタイプの船の統計、Kelley BluebookInSpaceの価格など。

すべてのShip-sはShipTypeから派生する必要があるため、ShipのコンストラクターはShipTypeを引数として取ります。そのコンストラクターは次のようになります。

...
def __init__(self,theshiptype):
    if not isinstance(theshiptype,ShipType):
        raise TypeError
    self.name=theshiptype.name
    self.inventory=Inventory(theshiptype.invslots)
    self.maxhp=theshiptype.maxhp
    self.thrust=theshiptype.thrust
    self.ftlspeed=theshiptype.ftlspeed
    ...

ご覧のとおり、このコンストラクターで行われていることの大部分は、渡されたオブジェクトから自分自身に同じ名前のプロパティをコピーすることです。私が疑問に思っているのは、これを行うためのより短い方法はありますか?

ShipTypeには、Shipに含めるべきではないプロパティがいくつかあることに注意してください。

4

1 に答える 1

5

あなたはこのようにそれを行うことができます:

attrsToCopy = ['name', 'inventory', 'maxhp', 'thrust', 'ftlspeed']
for attr in attrsToCopy:
    setattr(self, attr, getattr(theshiptype, attr))

getattrand関数を使用setattrすると、名前が文字列に格納されている属性を取得/設定できます。したがって、コピーする属性の名前のリストを指定し、リストをループして簡潔にコピーすることができます。

于 2013-03-03T04:29:07.740 に答える