0

変数のセットをクラスオブジェクトに割り当てます。通常は次のとおりです。

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

list と tuple を使用すると、これを行うことができます

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
player.__dict__.update({'x':12,'y':24,'name':'Billy'})

短くはありませんが、辞書を使用すると、提供したような直接的な例よりも多くの場合に便利です。

于 2012-09-14T07:51:57.147 に答える
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)

上記のコードは少し短くなっていますが、ループの前に 1 回アンパックされるため、大きな辞書の場合はより高速に実行されるはずです。プロパティ ディクショナリが反復ごとに呼び出される最初のバージョンと比較してください。

使用法:

set_properties(player, {'x': 1, 'y': 10, 'name': 'John'})
于 2012-09-14T07:47:31.740 に答える
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% 確信があるわけではありませんが、この例では、 a を使用するnamedtuple方がより良いアプローチになると思われます: 注意点として、既知のフィールドのみが存在する必要があります (つまり、動的に追加/削除することはできません)。 class は、フィールドへの属性スタイル アクセスを持つレコード以上のものではありません。

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 に答える