0

将一组变量分配给类对象,通常是这样的:

player.x = 1
player.y = 10
player.name = 'John'

因为列表和元组允许你这样做

a,b,c = (1,10,'John')

所以这行得通

player.x,player.y,player.name = (1,10,'John')

或这个

player.x,player.y,player.name = 1,10,'John'

我想更改player属性,我需要输入太多player. 这是一种更懒惰的方法吗?

4

7 回答 7

2

像这样的东西怎么样:

def set_properties(instance, properties):
    for property in properties:
        setattr(instance, property, properties[property])

由于我们谈论的是懒惰的程序员,您可以将函数重写为:

def set_properties(instance, properties):
    for key,val in properties.iteritems():
        setattr(instance, key, val)

上面的代码有点短,但对于大型字典也应该运行得更快,因为它在循环之前被解包一次。与每次迭代都调用属性字典的第一个版本相比。

用法:

set_properties(player, {'x': 1, 'y': 10, 'name': 'John'})
于 2012-09-14T07:47:31.740 回答
2
player.__dict__.update({'x':12,'y':24,'name':'Billy'})

不是更短,但在更多情况下使用字典比您提供的直接示例更方便。

于 2012-09-14T07:51:57.147 回答
1

使用zip()player.__dict__

In [14]: class player:
   ....:     pass
   ....: 

In [15]: for prop,value in zip(("x","y","name"),(1,10,"john")):
    player.__dict__[prop]=value
   ....:     
   ....:     

In [18]: player.__dict__
Out[18]: {'__doc__': None, '__module__': '__main__', 'name': 'john', 'x': 1, 'y': 10}
于 2012-09-14T07:57:26.017 回答
1

这是执行此操作的另一种方式,但与所有其他方式一样,它的可读性不如您开始的方式:

from functools import partial

map(partial(setattr, player), ("x", "y", "name"), (1, 10, 'John'))

如果您在代码中的多个位置设置相同的一组或多组属性,也许为每个这样的组添加一个命名良好的方法是一个更好的选择?

class Player(object):

    # [...]

    def set_stats(self, x, y, name):
        self.x = x
        self.y = y
        self.name = name

然后,您可以使用简短且易读的代码设置这些属性:

player.set_stats(1, 10, "John")
于 2012-09-14T07:58:18.447 回答
1

一个基本的循环可以工作:

for (k,v) in zip(attribute_names, attributes_values):
    setattr(player, k, v)

当然,您可以起诉一些列表理解,例如:

trash = [setattr(player, k, v) for (k,v) in zip(attribute_names, attributes_values)]

但它并没有真正改善任何东西(你的持有trash多达......Nonelen(attribute_names)

于 2012-09-14T08:39:48.620 回答
0

您可以使用一种方法将您可能发现总是一起发生的属性更改包装在一起,例如def edit(self, **kwargs)位置参数,并在其中分配给self.property = kwargs.get(propertyName, default)玩家类。您还可以在类上创建一个属性,该属性执行您在示例中使用的那种类型的元组分配。

于 2012-09-14T07:40:49.240 回答
0

我不是 100% 肯定,但在我看来,在这种情况下,使用 anamedtuple会是一种更好的方法:需要注意的是,只有已知字段应该存在(即,不能动态添加/删除)和类实际上只不过是具有属性样式访问字段的记录。

from collections import namedtuple

Player = namedtuple('Player', 'x y name')
player = Player._make([1, 3, 'Bob'])
print player
# Player(x=1, y=3, name='Bob')
player = player._replace(name='Jim', x=13)
print player
# Player(x=13, y=3, name='Jim')

否则,我会亲自为您的Player class.

于 2012-09-14T08:59:26.560 回答