は、Python 2.7.12のドキュメントによると:__setattr__()
はインスタンス属性に割り当てたい場合はなぜ新しいスタイルクラスでのみオブジェクト.__ setattr __(self、name、value)が優先されますか?
、それは単に
self.name = value
を実行してはならない - これは、自分自身への再帰呼び出し を引き起こします。代わりに、インスタンス属性の辞書 に値を挿入する必要があります(例:self.__dict__[name] = value
)。 新しいスタイルのクラスではではなく、インスタンス辞書にアクセスして、それが はobject.__setattr__(self, name, value)
、例えば、同じ名前の基底クラスのメソッドを呼び出す必要があります。
ただし、次のコードは1つが期待通りに動作します
class Class(object):
def __setattr__(self, name, val):
self.__dict__[name] = val;
c = Class()
c.val = 42
print c.val
私はsuper(Class, obj).__setattr__(name, value)
が呼び出されるすべての基底クラスの__setattr__
メソッドを確保することができます知っているが、古典的なクラスも拠点クラスから継承することができます。だから、なぜそれは新しいスタイルのクラスにのみ推奨されますか?
一方、クラシッククラスでは推奨されないのはなぜですか?
*新しいスタイルクラスにのみ推奨されるのはなぜですか?*インスタンス辞書で操作する代わりに '__setattr__'を呼び出すと、スーパークラスは何が起こっているのかを監督することができます。このアプローチを新しいスタイルクラスの利点と考えてください。*継承しない古いスタイルのクラスは*呼び出し可能な '__setattr__'メソッドを持つスーパークラスを持っていません。 – jedwards
@jedwards昔のクラスでは 'classobj .__ setattr__'がないので、新しいスタイルクラスでは' object .__ setattr__'だけです。 –
あなたはまさに正しいです。私の主張は、あなたが大胆に書いた文章を、インスタンスディクテーションを直接使用することからの落胆ではなく、見たことです(あなたが示したように、多くの場合完璧にうまくいきます.Martijnが示したように、 )、しかし、 "__setattr__"を使うことはもっと奨励*されます。これは、スーパークラスのいくつかの監視とディスクリプタなどの新しい機能の使用を可能にします。もし私が不明だったら申し訳ありません:) – jedwards