0

私はこれら3つの方法の間で本当に混乱しています

setattr()
__setattr__
obj.x = 10

私はこのテストクラスを持っています

class Test(object):
    def __init__(self):
        self.__dict__['x'] = 99

b = Test()
#setattr(b,'x',10)
#b.x = 10

今、私は2つの質問があります

bx に変換されます

b.x = 10 --> b.__setattr__(x,10) --> b.__dict__['x'] = 10

setattr(b,'x',10) も次のように変換されます。

setattr(b,'x',10) --> b.__setattr__(x,10) --> b.__dict__['x'] = 10

次に、なぜ一方を他方に使用するのか

  1. これは最低レベルの関数であるため、変数にどのように値が割り当てられても、私の値はb.xまたはsttattrまたはのいずれかで変更されません__setattr
4

2 に答える 2

0

b.x = 10割り当て先の属性を事前に知っている場合 (つまり、プログラムを作成する場合) に使用します。setattrわからないときに使用します (たとえば、ファイルから構成情報を読み取ったり、ある種の動的計画法を実行したりする場合)。

setattr(b, 'x', 10)そこにリテラルを入力してそれを入力できれば、入力を行って節約xできたはずだからです。次のようなものb.x = 10に使用します。setattr

optionName, optionValue = readConfigFile()
setattr(configObject, optionName, optionValue)

つまり、実行時までどの属性を割り当てるかわからない場合に使用します。これは、たとえば、外部リソース (私の例のように) またはユーザー入力に依存していることが原因である可能性があります。

于 2013-02-20T05:46:18.907 に答える
0

通常の方法は

b.x = 10

事前に属性名がわからない場合

attr_name = 'x'
setattr(b, attr_name, 10)

同じことを言う良い方法です。

これは、属性を に設定する良い方法ではありませんb

b.__dict__['x'] = 10

bあなたが属性を持っていると仮定しているよう__dict__に(すべてのオブジェクトが持っているわけではありません)

于 2013-02-20T05:46:21.257 に答える