0

この質問の目的は、「組み込み」が Python の組み込み関数である方法を理解することです。

setattr メソッドをオーバーライドした場合、どうすれば元に戻すことができますか? たとえば、次のような「Working」クラスがあります。

class WorkingSetAttr:
    def a(self): return 'a'
    def b(self): return 'b'

そして、クラス「NonWorking」は次のようになります。

class NonWorkingSetAttr: 
    def a(self): return 'a'
    def b(self): return 'b'
    def __setattr__(self,a,b): pass

次に、オブジェクト w と n を作成し、次を実行します。

w = WorkingSetAttr()
setattr(w,'a',w.b)
print "w.a = %s, w.b = %s" % (w.a(), w.b())

n = NonWorkingSetAttr()
setattr(n, 'a', n.b)
print "n.a = %s, n.b = %s" % (n.a(), n.b())

出力は次のとおりです。

w.a = b, w.b = b
n.a = a, n.b = b

na は "b" を出力するはずですが、setattr は属性を変更しないため、"a" を出力することに注意してください。

問題は、オブジェクトwのように機能するように、オブジェクトnをどのように変更すればよいかということです。クラスではなく、オブジェクトを意味していることに注意してください。

4

1 に答える 1

1

__setattr__クラスオブジェクトからカスタムを削除するだけです。

>>> n = NonWorkingSetAttr()
>>> setattr(n, 'a', n.b)
>>> print("n.a = %s, n.b = %s" % (n.a(), n.b()))
n.a = a, n.b = b
>>> 
>>> del NonWorkingSetAttr.__setattr__
>>>
>>> setattr(n, 'a', n.b)
>>> print("n.a = %s, n.b = %s" % (n.a(), n.b()))
n.a = b, n.b = b

これは、オブジェクトではなくクラスを変更することに注意してください。あなたは (ほぼ確実に) オブジェクト自体を変更したくありません。なぜなら、そうであるべきオブジェクトがあるはずなのにNonWorkingSetAttr、実際にはあなたが本当に理解していないある種の動的なものであるからです。

クラスを変更できない場合は、サブクラスを作成__setattr__してobject's:で再上書きできます。

>>> class FixedNonWorkingSetAttr(NonWorkingSetAttr):
...     __setattr__ = object.__setattr__
... 
>>> n = FixedNonWorkingSetAttr()
>>> setattr(n, 'a', n.b)
>>> print("n.a = %s, n.b = %s" % (n.a(), n.b()))
n.a = b, n.b = b
>>> isinstance(n, NonWorkingSetAttr)
True
于 2012-02-07T18:46:55.643 に答える