在Python 3中复制属性的更优雅方式

时间:2013-03-03 04:27:07

标签: python optimization properties

在我写的Python游戏中,我有两个类; ShipType和Ship。 Ship对象代表具有自己的名称,年龄,库存等的特定宇宙飞船...... ShipType对象代表船舶的“线”(如马自达Protege是汽车的“线”),具有自己的名称,基础这种类型船舶的统计数据,Kelley Bluebook In Space价格等等。

Ship的构造函数将ShipType作为参数,因为所有Ship-s都应从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
    ...

正如您所看到的,此构造函数中发生的大部分内容只是将传递对象的相同命名属性复制到self。我想知道的是,有更短的方法吗?

值得注意的是,ShipType上有一些属性不应该在Ship上。

1 个答案:

答案 0 :(得分:5)

你可以这样做:

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

使用getattrsetattr函数可以获取/设置名称存储在字符串中的属性。因此,您可以指定要复制的属性的名称列表,然后通过循环遍历列表来简洁地复制它们。