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

Sch*_*ote 1 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
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

Bre*_*arn 5

你可以这样做:

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

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